Blame src/win/winsock.h

Packit Service 7c31a4
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
Packit Service 7c31a4
 *
Packit Service 7c31a4
 * Permission is hereby granted, free of charge, to any person obtaining a copy
Packit Service 7c31a4
 * of this software and associated documentation files (the "Software"), to
Packit Service 7c31a4
 * deal in the Software without restriction, including without limitation the
Packit Service 7c31a4
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
Packit Service 7c31a4
 * sell copies of the Software, and to permit persons to whom the Software is
Packit Service 7c31a4
 * furnished to do so, subject to the following conditions:
Packit Service 7c31a4
 *
Packit Service 7c31a4
 * The above copyright notice and this permission notice shall be included in
Packit Service 7c31a4
 * all copies or substantial portions of the Software.
Packit Service 7c31a4
 *
Packit Service 7c31a4
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit Service 7c31a4
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit Service 7c31a4
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Packit Service 7c31a4
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Packit Service 7c31a4
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
Packit Service 7c31a4
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
Packit Service 7c31a4
 * IN THE SOFTWARE.
Packit Service 7c31a4
 */
Packit Service 7c31a4
Packit Service 7c31a4
#ifndef UV_WIN_WINSOCK_H_
Packit Service 7c31a4
#define UV_WIN_WINSOCK_H_
Packit Service 7c31a4
Packit Service 7c31a4
#include <winsock2.h>
Packit Service 7c31a4
#include <iptypes.h>
Packit Service 7c31a4
#include <mswsock.h>
Packit Service 7c31a4
#include <ws2tcpip.h>
Packit Service 7c31a4
#include <windows.h>
Packit Service 7c31a4
Packit Service 7c31a4
#include "winapi.h"
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
/*
Packit Service 7c31a4
 * MinGW is missing these too
Packit Service 7c31a4
 */
Packit Service 7c31a4
#ifndef SO_UPDATE_CONNECT_CONTEXT
Packit Service 7c31a4
# define SO_UPDATE_CONNECT_CONTEXT 0x7010
Packit Service 7c31a4
#endif
Packit Service 7c31a4
Packit Service 7c31a4
#ifndef TCP_KEEPALIVE
Packit Service 7c31a4
# define TCP_KEEPALIVE 3
Packit Service 7c31a4
#endif
Packit Service 7c31a4
Packit Service 7c31a4
#ifndef IPV6_V6ONLY
Packit Service 7c31a4
# define IPV6_V6ONLY 27
Packit Service 7c31a4
#endif
Packit Service 7c31a4
Packit Service 7c31a4
#ifndef IPV6_HOPLIMIT
Packit Service 7c31a4
# define IPV6_HOPLIMIT 21
Packit Service 7c31a4
#endif
Packit Service 7c31a4
Packit Service 7c31a4
#ifndef SIO_BASE_HANDLE
Packit Service 7c31a4
# define SIO_BASE_HANDLE 0x48000022
Packit Service 7c31a4
#endif
Packit Service 7c31a4
Packit Service 7c31a4
#ifndef MCAST_JOIN_SOURCE_GROUP
Packit Service 7c31a4
# define MCAST_JOIN_SOURCE_GROUP 45
Packit Service 7c31a4
#endif
Packit Service 7c31a4
Packit Service 7c31a4
#ifndef MCAST_LEAVE_SOURCE_GROUP
Packit Service 7c31a4
# define MCAST_LEAVE_SOURCE_GROUP 46
Packit Service 7c31a4
#endif
Packit Service 7c31a4
Packit Service 7c31a4
/*
Packit Service 7c31a4
 * TDI defines that are only in the DDK.
Packit Service 7c31a4
 * We only need receive flags so far.
Packit Service 7c31a4
 */
Packit Service 7c31a4
#ifndef TDI_RECEIVE_NORMAL
Packit Service 7c31a4
  #define TDI_RECEIVE_BROADCAST           0x00000004
Packit Service 7c31a4
  #define TDI_RECEIVE_MULTICAST           0x00000008
Packit Service 7c31a4
  #define TDI_RECEIVE_PARTIAL             0x00000010
Packit Service 7c31a4
  #define TDI_RECEIVE_NORMAL              0x00000020
Packit Service 7c31a4
  #define TDI_RECEIVE_EXPEDITED           0x00000040
Packit Service 7c31a4
  #define TDI_RECEIVE_PEEK                0x00000080
Packit Service 7c31a4
  #define TDI_RECEIVE_NO_RESPONSE_EXP     0x00000100
Packit Service 7c31a4
  #define TDI_RECEIVE_COPY_LOOKAHEAD      0x00000200
Packit Service 7c31a4
  #define TDI_RECEIVE_ENTIRE_MESSAGE      0x00000400
Packit Service 7c31a4
  #define TDI_RECEIVE_AT_DISPATCH_LEVEL   0x00000800
Packit Service 7c31a4
  #define TDI_RECEIVE_CONTROL_INFO        0x00001000
Packit Service 7c31a4
  #define TDI_RECEIVE_FORCE_INDICATION    0x00002000
Packit Service 7c31a4
  #define TDI_RECEIVE_NO_PUSH             0x00004000
Packit Service 7c31a4
#endif
Packit Service 7c31a4
Packit Service 7c31a4
/*
Packit Service 7c31a4
 * The "Auxiliary Function Driver" is the windows kernel-mode driver that does
Packit Service 7c31a4
 * TCP, UDP etc. Winsock is just a layer that dispatches requests to it.
Packit Service 7c31a4
 * Having these definitions allows us to bypass winsock and make an AFD kernel
Packit Service 7c31a4
 * call directly, avoiding a bug in winsock's recvfrom implementation.
Packit Service 7c31a4
 */
Packit Service 7c31a4
Packit Service 7c31a4
#define AFD_NO_FAST_IO   0x00000001
Packit Service 7c31a4
#define AFD_OVERLAPPED   0x00000002
Packit Service 7c31a4
#define AFD_IMMEDIATE    0x00000004
Packit Service 7c31a4
Packit Service 7c31a4
#define AFD_POLL_RECEIVE_BIT            0
Packit Service 7c31a4
#define AFD_POLL_RECEIVE                (1 << AFD_POLL_RECEIVE_BIT)
Packit Service 7c31a4
#define AFD_POLL_RECEIVE_EXPEDITED_BIT  1
Packit Service 7c31a4
#define AFD_POLL_RECEIVE_EXPEDITED      (1 << AFD_POLL_RECEIVE_EXPEDITED_BIT)
Packit Service 7c31a4
#define AFD_POLL_SEND_BIT               2
Packit Service 7c31a4
#define AFD_POLL_SEND                   (1 << AFD_POLL_SEND_BIT)
Packit Service 7c31a4
#define AFD_POLL_DISCONNECT_BIT         3
Packit Service 7c31a4
#define AFD_POLL_DISCONNECT             (1 << AFD_POLL_DISCONNECT_BIT)
Packit Service 7c31a4
#define AFD_POLL_ABORT_BIT              4
Packit Service 7c31a4
#define AFD_POLL_ABORT                  (1 << AFD_POLL_ABORT_BIT)
Packit Service 7c31a4
#define AFD_POLL_LOCAL_CLOSE_BIT        5
Packit Service 7c31a4
#define AFD_POLL_LOCAL_CLOSE            (1 << AFD_POLL_LOCAL_CLOSE_BIT)
Packit Service 7c31a4
#define AFD_POLL_CONNECT_BIT            6
Packit Service 7c31a4
#define AFD_POLL_CONNECT                (1 << AFD_POLL_CONNECT_BIT)
Packit Service 7c31a4
#define AFD_POLL_ACCEPT_BIT             7
Packit Service 7c31a4
#define AFD_POLL_ACCEPT                 (1 << AFD_POLL_ACCEPT_BIT)
Packit Service 7c31a4
#define AFD_POLL_CONNECT_FAIL_BIT       8
Packit Service 7c31a4
#define AFD_POLL_CONNECT_FAIL           (1 << AFD_POLL_CONNECT_FAIL_BIT)
Packit Service 7c31a4
#define AFD_POLL_QOS_BIT                9
Packit Service 7c31a4
#define AFD_POLL_QOS                    (1 << AFD_POLL_QOS_BIT)
Packit Service 7c31a4
#define AFD_POLL_GROUP_QOS_BIT          10
Packit Service 7c31a4
#define AFD_POLL_GROUP_QOS              (1 << AFD_POLL_GROUP_QOS_BIT)
Packit Service 7c31a4
Packit Service 7c31a4
#define AFD_NUM_POLL_EVENTS             11
Packit Service 7c31a4
#define AFD_POLL_ALL                    ((1 << AFD_NUM_POLL_EVENTS) - 1)
Packit Service 7c31a4
Packit Service 7c31a4
typedef struct _AFD_RECV_DATAGRAM_INFO {
Packit Service 7c31a4
    LPWSABUF BufferArray;
Packit Service 7c31a4
    ULONG BufferCount;
Packit Service 7c31a4
    ULONG AfdFlags;
Packit Service 7c31a4
    ULONG TdiFlags;
Packit Service 7c31a4
    struct sockaddr* Address;
Packit Service 7c31a4
    int* AddressLength;
Packit Service 7c31a4
} AFD_RECV_DATAGRAM_INFO, *PAFD_RECV_DATAGRAM_INFO;
Packit Service 7c31a4
Packit Service 7c31a4
typedef struct _AFD_RECV_INFO {
Packit Service 7c31a4
    LPWSABUF BufferArray;
Packit Service 7c31a4
    ULONG BufferCount;
Packit Service 7c31a4
    ULONG AfdFlags;
Packit Service 7c31a4
    ULONG TdiFlags;
Packit Service 7c31a4
} AFD_RECV_INFO, *PAFD_RECV_INFO;
Packit Service 7c31a4
Packit Service 7c31a4
Packit Service 7c31a4
#define _AFD_CONTROL_CODE(operation, method) \
Packit Service 7c31a4
    ((FSCTL_AFD_BASE) << 12 | (operation << 2) | method)
Packit Service 7c31a4
Packit Service 7c31a4
#define FSCTL_AFD_BASE FILE_DEVICE_NETWORK
Packit Service 7c31a4
Packit Service 7c31a4
#define AFD_RECEIVE            5
Packit Service 7c31a4
#define AFD_RECEIVE_DATAGRAM   6
Packit Service 7c31a4
#define AFD_POLL               9
Packit Service 7c31a4
Packit Service 7c31a4
#define IOCTL_AFD_RECEIVE \
Packit Service 7c31a4
    _AFD_CONTROL_CODE(AFD_RECEIVE, METHOD_NEITHER)
Packit Service 7c31a4
Packit Service 7c31a4
#define IOCTL_AFD_RECEIVE_DATAGRAM \
Packit Service 7c31a4
    _AFD_CONTROL_CODE(AFD_RECEIVE_DATAGRAM, METHOD_NEITHER)
Packit Service 7c31a4
Packit Service 7c31a4
#define IOCTL_AFD_POLL \
Packit Service 7c31a4
    _AFD_CONTROL_CODE(AFD_POLL, METHOD_BUFFERED)
Packit Service 7c31a4
Packit Service 7c31a4
#if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)
Packit Service 7c31a4
typedef struct _IP_ADAPTER_UNICAST_ADDRESS_XP {
Packit Service 7c31a4
  /* FIXME: __C89_NAMELESS was removed */
Packit Service 7c31a4
  /* __C89_NAMELESS */ union {
Packit Service 7c31a4
    ULONGLONG Alignment;
Packit Service 7c31a4
    /* __C89_NAMELESS */ struct {
Packit Service 7c31a4
      ULONG Length;
Packit Service 7c31a4
      DWORD Flags;
Packit Service 7c31a4
    };
Packit Service 7c31a4
  };
Packit Service 7c31a4
  struct _IP_ADAPTER_UNICAST_ADDRESS_XP *Next;
Packit Service 7c31a4
  SOCKET_ADDRESS Address;
Packit Service 7c31a4
  IP_PREFIX_ORIGIN PrefixOrigin;
Packit Service 7c31a4
  IP_SUFFIX_ORIGIN SuffixOrigin;
Packit Service 7c31a4
  IP_DAD_STATE DadState;
Packit Service 7c31a4
  ULONG ValidLifetime;
Packit Service 7c31a4
  ULONG PreferredLifetime;
Packit Service 7c31a4
  ULONG LeaseLifetime;
Packit Service 7c31a4
} IP_ADAPTER_UNICAST_ADDRESS_XP,*PIP_ADAPTER_UNICAST_ADDRESS_XP;
Packit Service 7c31a4
Packit Service 7c31a4
typedef struct _IP_ADAPTER_UNICAST_ADDRESS_LH {
Packit Service 7c31a4
  union {
Packit Service 7c31a4
    ULONGLONG Alignment;
Packit Service 7c31a4
    struct {
Packit Service 7c31a4
      ULONG Length;
Packit Service 7c31a4
      DWORD Flags;
Packit Service 7c31a4
    };
Packit Service 7c31a4
  };
Packit Service 7c31a4
  struct _IP_ADAPTER_UNICAST_ADDRESS_LH *Next;
Packit Service 7c31a4
  SOCKET_ADDRESS Address;
Packit Service 7c31a4
  IP_PREFIX_ORIGIN PrefixOrigin;
Packit Service 7c31a4
  IP_SUFFIX_ORIGIN SuffixOrigin;
Packit Service 7c31a4
  IP_DAD_STATE DadState;
Packit Service 7c31a4
  ULONG ValidLifetime;
Packit Service 7c31a4
  ULONG PreferredLifetime;
Packit Service 7c31a4
  ULONG LeaseLifetime;
Packit Service 7c31a4
  UINT8 OnLinkPrefixLength;
Packit Service 7c31a4
} IP_ADAPTER_UNICAST_ADDRESS_LH,*PIP_ADAPTER_UNICAST_ADDRESS_LH;
Packit Service 7c31a4
Packit Service 7c31a4
#endif
Packit Service 7c31a4
Packit Service 7c31a4
int uv__convert_to_localhost_if_unspecified(const struct sockaddr* addr,
Packit Service 7c31a4
                                            struct sockaddr_storage* storage);
Packit Service 7c31a4
Packit Service 7c31a4
#endif /* UV_WIN_WINSOCK_H_ */