Blame src/win/winsock.h

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