cosmopolitan/libc/nt/struct/ipadapteraddresses.h
Justine Tunney 5144c22189 Add test for ioctl(SIOCGIFCONF) and polyfill on BSDs
- Use nullness checks when calling weakly linked functions.

- Avoid typedef for reasons described in Linux Kernel style guide.

- Avoid enum in in Windows headers. Earlier in Cosmo's history all one
  hundred files in libc/nt/enum/ used to be enums and it resulted in
  gigabytes of DWARF data almost as large as everything else in the
  codebase combined.

- Bitfields aren't our friends. They have frequent ABI breakages,
  inconsistent arithmetic across compilers, and different endianness
  between cpus. Compiler authors also haven't invested much roi into
  making bit fields go fast so they produce poor assembly.

- Use memccpy() instead of strncpy() or snprintf() for length-bounded
  copying of C strings. strncpy() is a misunderstood function and
  snprintf() is awesome but memccpy() deserves more love.
2021-06-25 18:44:04 -07:00

204 lines
6.6 KiB
C

#ifndef COSMOPOLITAN_LIBC_NT_STRUCT_IP_ADAPTER_ADDRESSES_H_
#define COSMOPOLITAN_LIBC_NT_STRUCT_IP_ADAPTER_ADDRESSES_H_
#include "libc/nt/struct/guid.h"
#include "libc/nt/winsock.h"
/* Constants ----------------------------------------------------------- */
#define kNtMaxAdapterAddressLength 8
#define kNtMaxDnsSuffixStringLength 256
#define kNtMaxDhcpv6DuidLength 130
/* Values for the 'Flags' parameter of GetAdaptersAddresses */
#define kNtGaaFlagSkipUnicast 0x0001
#define kNtGaaFlagSkipAnycast 0x0002
#define kNtGaaFlagSkipMulticast 0x0004
#define kNtGaaFlagSkipDnsServer 0x0008
#define kNtGaaFlagIncludePrefix 0x0010
#define kNtGaaFlagSkipFriendlyName 0x0020
#define kNtGaaFlagIncludeWinsInfo 0x0040
#define kNtGaaFlagIncludeGateways 0x0080
#define kNtGaaFlagIncludeAllInterfaces 0x0100
#define kNtGaaFlagIncludeAllCompartments 0x0200
#define kNtGaaFlagIncludeTunnelBindingorder 0x0400
#define kNtGaaFlagSkipDnsInfo 0x0800
/* Values for the IfType parameter
* See:
* https://docs.microsoft.com/en-us/windows/win32/api/iptypes/ns-iptypes-ip_adapter_addresses_lh
*/
#define kNtIfTypeOther 1
#define kNtIfTypeEthernetCsmacd 6
#define kNtIfTypeIso88025Tokenring 9
#define kNtIfTypePpp 23
#define kNtIfTypeSoftwareLoopback 24
#define kNtIfTypeAtm 37
#define kNtIfTypeIeee80211 71 /* wifi */
#define kNtIfTypeTunnel 131
#define kNtIfTypeIeee1394 144 /* firewire */
#define kNtIpAdapterDdnsEnabled 0x0001
#define kNtIpAdapterRegisterAdapterSuffix 0x0002
#define kNtIpAdapterDhcpv4Enabled 0x0004
#define kNtIpAdapterReceiveOnly 0x0008
#define kNtIpAdapterNoMulticast 0x0010
#define kNtIpAdapterIpv6OtherStatefulConfig 0x0020
#define kNtIpAdapterNetbiosOverTcpipEnabled 0x0040
#define kNtIpAdapterIpv4Enabled 0x0080
#define kNtIpAdapterIpv6Enabled 0x0100
#define kNtIpAdapterIpv6Managed 0x0200
#define kNtIpPrefixOriginOther 0
#define kNtIpPrefixOriginManual 1
#define kNtIpPrefixOriginWellKnown 2
#define kNtIpPrefixOriginDhcp 3
#define kNtIpPrefixOriginRouterAdvertisement 4
#define kNtIpPrefixOriginUnchanged 16
#define kNtIpSuffixOriginOther 0
#define kNtIpSuffixOriginManual 1
#define kNtIpSuffixOriginWellKnown 2
#define kNtIpSuffixOriginDhcp 3
#define kNtIpSuffixOriginLinkLayerAddress 4
#define kNtIpSuffixOriginRandom 5
#define kNtIpSuffixOriginUnchanged 16
#define kNtIpDadStateInvalid 0
#define kNtIpDadStateTentative 1
#define kNtIpDadStateDuplicate 2
#define kNtIpDadStateDeprecated 3
#define kNtIpDadStatePreferred 4
#define kNtIfOperStatusUp 1
#define kNtIfOperStatusDown 2
#define kNtIfOperStatusTesting 3
#define kNtIfOperStatusUnknown 4
#define kNtIfOperStatusDormant 5
#define kNtIfOperStatusNotPresent 6
#define kNtIfOperStatusLowerLayerDown 7
#define kNtNetIfConnectionDedicated 1
#define kNtNetIfConnectionPassive 2
#define kNtNetIfConnectionDemand 3
#define kNtNetIfConnectionMaximum 4
#define kNtTunnelTypeNone 0
#define kNtTunnelTypeOther 1
#define kNtTunnelTypeDirect 2
#define kNtTunnelType6to4 11
#define kNtTunnelTypeIsatap 13
#define kNtTunnelTypeTeredo 14
#define kNtTunnelTypeIphttps 15
#if !(__ASSEMBLER__ + __LINKER__ + 0)
COSMOPOLITAN_C_START_
/* Inner Types --------------------------------------------------------- */
struct NtIpAdapterUnicastAddress {
uint32_t Length;
uint32_t Flags;
struct NtIpAdapterUnicastAddress *Next;
struct NtSocketAddress Address;
uint32_t PrefixOrigin; /* kNtIpPrefixOrigin... */
uint32_t SuffixOrigin; /* kNtIpSuffixOrigin... */
uint32_t DadState; /* kNtIpDadState... */
uint32_t ValidLifetime;
uint32_t PreferredLifetime;
uint32_t LeaseLifetime;
uint8_t OnLinkPrefixLength;
};
struct NtIpAdapterAnycastAddress {
uint32_t Length;
uint32_t Flags;
struct NtIpAdapterAnycastAddress *Next;
struct NtSocketAddress Address;
};
struct NtIpAdapterMulticastAddress {
uint32_t Length;
uint32_t Flags;
struct NtIpAdapterMulticastAddress *Next;
struct NtSocketAddress Address;
};
struct NtIpAdapterDnsServerAddress {
uint32_t Length;
uint32_t Reserved;
struct NtIpAdapterDnsServerAddress *Next;
struct NtSocketAddress Address;
};
struct NtIpAdapterPrefix {
uint32_t Length;
uint32_t Flags;
struct NtIpAdapterPrefix *Next;
struct NtSocketAddress Address;
uint32_t PrefixLength;
};
struct NtIpAdapterWinsServerAddress {
uint32_t Length;
uint32_t Reserved;
struct NtIpAdapterWinsServerAddress *Next;
struct NtSocketAddress Address;
};
struct NtIpAdapterGatewayAddress {
uint32_t Length;
uint32_t Reserved;
struct NtIpAdapterGatewayAddress *Next;
struct NtSocketAddress Address;
};
struct NtIpAdapterDnsSuffix {
struct NtIpAdapterDnsSuffix *Next;
uint16_t String[kNtMaxDnsSuffixStringLength];
};
/* Top level ----------------------------------------------------------- */
struct NtIpAdapterAddresses {
uint32_t Length;
uint32_t IfIndex;
struct NtIpAdapterAddresses *Next;
char *AdapterName;
struct NtIpAdapterUnicastAddress *FirstUnicastAddress;
struct NtIpAdapterAnycastAddress *FirstAnycastAddress;
struct NtIpAdapterMulticastAddress *FirstMulticastAddress;
struct NtIpAdapterDnsServerAddress *FirstDnsServerAddress;
uint16_t *DnsSuffix;
uint16_t *Description;
uint16_t *FriendlyName;
uint8_t PhysicalAddress[kNtMaxAdapterAddressLength];
uint32_t PhysicalAddressLength;
uint32_t Flags; /* kNtIpAdapter... */
uint32_t Mtu;
uint32_t IfType; /* kNtIfType... */
uint32_t OperStatus; /* kNtIfOperStatus... */
uint32_t Ipv6IfIndex;
uint32_t ZoneIndices[16];
struct NtIpAdapterPrefix *FirstPrefix;
uint64_t TransmitLinkSpeed;
uint64_t ReceiveLinkSpeed;
struct NtIpAdapterWinsServerAddress *FirstWinsServerAddress;
struct NtIpAdapterGatewayAddress *FirstGatewayAddress;
uint32_t Ipv4Metric;
uint32_t Ipv6Metric;
uint64_t Luid; /* reserved(24bits),NetLuidIndex(24b),IfType(16b) */
struct NtSocketAddress Dhcpv4Server;
uint32_t CompartmentId;
struct NtGuid NetworkGuid;
uint32_t ConnectionType; /* kNtNetIfConnection... */
uint32_t TunnelType; /* kNtTunnelType... */
struct NtSocketAddress Dhcpv6Server;
uint8_t Dhcpv6ClientDuid[kNtMaxDhcpv6DuidLength];
uint32_t Dhcpv6ClientDuidLength;
uint32_t Dhcpv6Iaid;
struct NtIpAdapterDnsSuffix *FirstDnsSuffix;
};
COSMOPOLITAN_C_END_
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
#endif /* COSMOPOLITAN_LIBC_NT_STRUCT_IP_ADAPTER_ADDRESSES_H_ */