aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/tunnel/winipcfg/types.go
diff options
context:
space:
mode:
Diffstat (limited to 'tunnel/winipcfg/types.go')
-rw-r--r--tunnel/winipcfg/types.go952
1 files changed, 952 insertions, 0 deletions
diff --git a/tunnel/winipcfg/types.go b/tunnel/winipcfg/types.go
new file mode 100644
index 00000000..684a6c77
--- /dev/null
+++ b/tunnel/winipcfg/types.go
@@ -0,0 +1,952 @@
+/* SPDX-License-Identifier: MIT
+ *
+ * Copyright (C) 2019 WireGuard LLC. All Rights Reserved.
+ */
+
+package winipcfg
+
+import (
+ "bytes"
+ "net"
+ "unsafe"
+
+ "golang.org/x/sys/windows"
+)
+
+const (
+ anySize = 1
+ maxDNSSuffixStringLength = 256
+ maxDHCPv6DUIDLength = 130
+ ifMaxStringSize = 256
+ ifMaxPhysAddressLength = 32
+)
+
+// AddressFamily enumeration specifies protocol family and is one of the windows.AF_* constants.
+type AddressFamily uint16
+
+// IPAAFlags enumeration describes adapter addresses flags
+// https://docs.microsoft.com/en-us/windows/desktop/api/iptypes/ns-iptypes-_ip_adapter_addresses_lh
+type IPAAFlags uint32
+
+const (
+ IPAAFlagDdnsEnabled IPAAFlags = 1 << iota
+ IPAAFlagRegisterAdapterSuffix
+ IPAAFlagDhcpv4Enabled
+ IPAAFlagReceiveOnly
+ IPAAFlagNoMulticast
+ IPAAFlagIpv6OtherStatefulConfig
+ IPAAFlagNetbiosOverTcpipEnabled
+ IPAAFlagIpv4Enabled
+ IPAAFlagIpv6Enabled
+ IPAAFlagIpv6ManagedAddressConfigurationSupported
+)
+
+// IfOperStatus enumeration specifies the operational status of an interface.
+// https://docs.microsoft.com/en-us/windows/desktop/api/ifdef/ne-ifdef-if_oper_status
+type IfOperStatus uint32
+
+const (
+ IfOperStatusUp IfOperStatus = iota + 1
+ IfOperStatusDown
+ IfOperStatusTesting
+ IfOperStatusUnknown
+ IfOperStatusDormant
+ IfOperStatusNotPresent
+ IfOperStatusLowerLayerDown
+)
+
+// IfType enumeration specifies interface type.
+type IfType uint32
+
+const (
+ IfTypeOther IfType = 1 // None of the below
+ IfTypeRegular1822 = 2
+ IfTypeHdh1822 = 3
+ IfTypeDdnX25 = 4
+ IfTypeRfc877X25 = 5
+ IfTypeEthernetCSMACD = 6
+ IfTypeISO88023CSMACD = 7
+ IfTypeISO88024Tokenbus = 8
+ IfTypeISO88025Tokenring = 9
+ IfTypeISO88026Man = 10
+ IfTypeStarlan = 11
+ IfTypeProteon10Mbit = 12
+ IfTypeProteon80Mbit = 13
+ IfTypeHyperchannel = 14
+ IfTypeFddi = 15
+ IfTypeLapB = 16
+ IfTypeSdlc = 17
+ IfTypeDs1 = 18 // DS1-MIB
+ IfTypeE1 = 19 // Obsolete; see DS1-MIB
+ IfTypeBasicISDN = 20
+ IfTypePrimaryISDN = 21
+ IfTypePropPoint2PointSerial = 22 // proprietary serial
+ IfTypePPP = 23
+ IfTypeSoftwareLoopback = 24
+ IfTypeEon = 25 // CLNP over IP
+ IfTypeEthernet3Mbit = 26
+ IfTypeNsip = 27 // XNS over IP
+ IfTypeSlip = 28 // Generic Slip
+ IfTypeUltra = 29 // ULTRA Technologies
+ IfTypeDs3 = 30 // DS3-MIB
+ IfTypeSip = 31 // SMDS, coffee
+ IfTypeFramerelay = 32 // DTE only
+ IfTypeRs232 = 33
+ IfTypePara = 34 // Parallel port
+ IfTypeArcnet = 35
+ IfTypeArcnetPlus = 36
+ IfTypeAtm = 37 // ATM cells
+ IfTypeMioX25 = 38
+ IfTypeSonet = 39 // SONET or SDH
+ IfTypeX25Ple = 40
+ IfTypeIso88022LLC = 41
+ IfTypeLocaltalk = 42
+ IfTypeSmdsDxi = 43
+ IfTypeFramerelayService = 44 // FRNETSERV-MIB
+ IfTypeV35 = 45
+ IfTypeHssi = 46
+ IfTypeHippi = 47
+ IfTypeModem = 48 // Generic Modem
+ IfTypeAal5 = 49 // AAL5 over ATM
+ IfTypeSonetPath = 50
+ IfTypeSonetVt = 51
+ IfTypeSmdsIcip = 52 // SMDS InterCarrier Interface
+ IfTypePropVirtual = 53 // Proprietary virtual/internal
+ IfTypePropMultiplexor = 54 // Proprietary multiplexing
+ IfTypeIEEE80212 = 55 // 100BaseVG
+ IfTypeFibrechannel = 56
+ IfTypeHippiinterface = 57
+ IfTypeFramerelayInterconnect = 58 // Obsolete, use 32 or 44
+ IfTypeAflane8023 = 59 // ATM Emulated LAN for 802.3
+ IfTypeAflane8025 = 60 // ATM Emulated LAN for 802.5
+ IfTypeCctemul = 61 // ATM Emulated circuit
+ IfTypeFastether = 62 // Fast Ethernet (100BaseT)
+ IfTypeISDN = 63 // ISDN and X.25
+ IfTypeV11 = 64 // CCITT V.11/X.21
+ IfTypeV36 = 65 // CCITT V.36
+ IfTypeG703_64k = 66 // CCITT G703 at 64Kbps
+ IfTypeG703_2mb = 67 // Obsolete; see DS1-MIB
+ IfTypeQllc = 68 // SNA QLLC
+ IfTypeFastetherFX = 69 // Fast Ethernet (100BaseFX)
+ IfTypeChannel = 70
+ IfTypeIEEE80211 = 71 // Radio spread spectrum
+ IfTypeIBM370parchan = 72 // IBM System 360/370 OEMI Channel
+ IfTypeEscon = 73 // IBM Enterprise Systems Connection
+ IfTypeDlsw = 74 // Data Link Switching
+ IfTypeISDNS = 75 // ISDN S/T interface
+ IfTypeISDNU = 76 // ISDN U interface
+ IfTypeLapD = 77 // Link Access Protocol D
+ IfTypeIpswitch = 78 // IP Switching Objects
+ IfTypeRsrb = 79 // Remote Source Route Bridging
+ IfTypeAtmLogical = 80 // ATM Logical Port
+ IfTypeDs0 = 81 // Digital Signal Level 0
+ IfTypeDs0Bundle = 82 // Group of ds0s on the same ds1
+ IfTypeBsc = 83 // Bisynchronous Protocol
+ IfTypeAsync = 84 // Asynchronous Protocol
+ IfTypeCnr = 85 // Combat Net Radio
+ IfTypeIso88025rDtr = 86 // ISO 802.5r DTR
+ IfTypeEplrs = 87 // Ext Pos Loc Report Sys
+ IfTypeArap = 88 // Appletalk Remote Access Protocol
+ IfTypePropCnls = 89 // Proprietary Connectionless Proto
+ IfTypeHostpad = 90 // CCITT-ITU X.29 PAD Protocol
+ IfTypeTermpad = 91 // CCITT-ITU X.3 PAD Facility
+ IfTypeFramerelayMpi = 92 // Multiproto Interconnect over FR
+ IfTypeX213 = 93 // CCITT-ITU X213
+ IfTypeAdsl = 94 // Asymmetric Digital Subscrbr Loop
+ IfTypeRadsl = 95 // Rate-Adapt Digital Subscrbr Loop
+ IfTypeSdsl = 96 // Symmetric Digital Subscriber Loop
+ IfTypeVdsl = 97 // Very H-Speed Digital Subscrb Loop
+ IfTypeIso88025Crfprint = 98 // ISO 802.5 CRFP
+ IfTypeMyrinet = 99 // Myricom Myrinet
+ IfTypeVoiceEm = 100 // Voice recEive and transMit
+ IfTypeVoiceFxo = 101 // Voice Foreign Exchange Office
+ IfTypeVoiceFxs = 102 // Voice Foreign Exchange Station
+ IfTypeVoiceEncap = 103 // Voice encapsulation
+ IfTypeVoiceOverip = 104 // Voice over IP encapsulation
+ IfTypeAtmDxi = 105 // ATM DXI
+ IfTypeAtmFuni = 106 // ATM FUNI
+ IfTypeAtmIma = 107 // ATM IMA
+ IfTypePPPmultilinkbundle = 108 // PPP Multilink Bundle
+ IfTypeIpoverCdlc = 109 // IBM ipOverCdlc
+ IfTypeIpoverClaw = 110 // IBM Common Link Access to Workstn
+ IfTypeStacktostack = 111 // IBM stackToStack
+ IfTypeVirtualipaddress = 112 // IBM VIPA
+ IfTypeMpc = 113 // IBM multi-proto channel support
+ IfTypeIpoverAtm = 114 // IBM ipOverAtm
+ IfTypeIso88025Fiber = 115 // ISO 802.5j Fiber Token Ring
+ IfTypeTdlc = 116 // IBM twinaxial data link control
+ IfTypeGigabitethernet = 117
+ IfTypeHdlc = 118
+ IfTypeLapF = 119
+ IfTypeV37 = 120
+ IfTypeX25Mlp = 121 // Multi-Link Protocol
+ IfTypeX25Huntgroup = 122 // X.25 Hunt Group
+ IfTypeTransphdlc = 123
+ IfTypeInterleave = 124 // Interleave channel
+ IfTypeFast = 125 // Fast channel
+ IfTypeIP = 126 // IP (for APPN HPR in IP networks)
+ IfTypeDocscableMaclayer = 127 // CATV Mac Layer
+ IfTypeDocscableDownstream = 128 // CATV Downstream interface
+ IfTypeDocscableUpstream = 129 // CATV Upstream interface
+ IfTypeA12mppswitch = 130 // Avalon Parallel Processor
+ IfTypeTunnel = 131 // Encapsulation interface
+ IfTypeCoffee = 132 // Coffee pot
+ IfTypeCes = 133 // Circuit Emulation Service
+ IfTypeAtmSubinterface = 134 // ATM Sub Interface
+ IfTypeL2Vlan = 135 // Layer 2 Virtual LAN using 802.1Q
+ IfTypeL3Ipvlan = 136 // Layer 3 Virtual LAN using IP
+ IfTypeL3Ipxvlan = 137 // Layer 3 Virtual LAN using IPX
+ IfTypeDigitalpowerline = 138 // IP over Power Lines
+ IfTypeMediamailoverip = 139 // Multimedia Mail over IP
+ IfTypeDtm = 140 // Dynamic syncronous Transfer Mode
+ IfTypeDcn = 141 // Data Communications Network
+ IfTypeIpforward = 142 // IP Forwarding Interface
+ IfTypeMsdsl = 143 // Multi-rate Symmetric DSL
+ IfTypeIEEE1394 = 144 // IEEE1394 High Perf Serial Bus
+ IfTypeIfGsn = 145
+ IfTypeDvbrccMaclayer = 146
+ IfTypeDvbrccDownstream = 147
+ IfTypeDvbrccUpstream = 148
+ IfTypeAtmVirtual = 149
+ IfTypeMplsTunnel = 150
+ IfTypeSrp = 151
+ IfTypeVoiceoveratm = 152
+ IfTypeVoiceoverframerelay = 153
+ IfTypeIdsl = 154
+ IfTypeCompositelink = 155
+ IfTypeSs7Siglink = 156
+ IfTypePropWirelessP2P = 157
+ IfTypeFrForward = 158
+ IfTypeRfc1483 = 159
+ IfTypeUsb = 160
+ IfTypeIEEE8023adLag = 161
+ IfTypeBgpPolicyAccounting = 162
+ IfTypeFrf16MfrBundle = 163
+ IfTypeH323Gatekeeper = 164
+ IfTypeH323Proxy = 165
+ IfTypeMpls = 166
+ IfTypeMfSiglink = 167
+ IfTypeHdsl2 = 168
+ IfTypeShdsl = 169
+ IfTypeDs1Fdl = 170
+ IfTypePos = 171
+ IfTypeDvbAsiIn = 172
+ IfTypeDvbAsiOut = 173
+ IfTypePlc = 174
+ IfTypeNfas = 175
+ IfTypeTr008 = 176
+ IfTypeGr303Rdt = 177
+ IfTypeGr303Idt = 178
+ IfTypeIsup = 179
+ IfTypePropDocsWirelessMaclayer = 180
+ IfTypePropDocsWirelessDownstream = 181
+ IfTypePropDocsWirelessUpstream = 182
+ IfTypeHiperlan2 = 183
+ IfTypePropBwaP2MP = 184
+ IfTypeSonetOverheadChannel = 185
+ IfTypeDigitalWrapperOverheadChannel = 186
+ IfTypeAal2 = 187
+ IfTypeRadioMac = 188
+ IfTypeAtmRadio = 189
+ IfTypeImt = 190
+ IfTypeMvl = 191
+ IfTypeReachDsl = 192
+ IfTypeFrDlciEndpt = 193
+ IfTypeAtmVciEndpt = 194
+ IfTypeOpticalChannel = 195
+ IfTypeOpticalTransport = 196
+ IfTypeIEEE80216Wman = 237
+ IfTypeWwanpp = 243 // WWAN devices based on GSM technology
+ IfTypeWwanpp2 = 244 // WWAN devices based on CDMA technology
+ IfTypeIEEE802154 = 259 // IEEE 802.15.4 WPAN interface
+ IfTypeXboxWireless = 281
+)
+
+// MibIfEntryLevel enumeration specifies level of interface information to retrieve in GetIfTable2Ex function call.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/nf-netioapi-getifentry2ex
+type MibIfEntryLevel uint32
+
+const (
+ MibIfEntryNormal MibIfEntryLevel = 0
+ MibIfEntryNormalWithoutStatistics = 2
+)
+
+// NdisMedium enumeration type identifies the medium types that NDIS drivers support.
+// https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/ntddndis/ne-ntddndis-_ndis_medium
+type NdisMedium uint32
+
+const (
+ NdisMedium802_3 NdisMedium = iota
+ NdisMedium802_5
+ NdisMediumFddi
+ NdisMediumWan
+ NdisMediumLocalTalk
+ NdisMediumDix // defined for convenience, not a real medium
+ NdisMediumArcnetRaw
+ NdisMediumArcnet878_2
+ NdisMediumAtm
+ NdisMediumWirelessWan
+ NdisMediumIrda
+ NdisMediumBpc
+ NdisMediumCoWan
+ NdisMedium1394
+ NdisMediumInfiniBand
+ NdisMediumTunnel
+ NdisMediumNative802_11
+ NdisMediumLoopback
+ NdisMediumWiMAX
+ NdisMediumIP
+ NdisMediumMax
+)
+
+// NdisPhysicalMedium describes NDIS physical medium type.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/ns-netioapi-_mib_if_row2
+type NdisPhysicalMedium uint32
+
+const (
+ NdisPhysicalMediumUnspecified NdisPhysicalMedium = iota
+ NdisPhysicalMediumWirelessLan
+ NdisPhysicalMediumCableModem
+ NdisPhysicalMediumPhoneLine
+ NdisPhysicalMediumPowerLine
+ NdisPhysicalMediumDSL // includes ADSL and UADSL (G.Lite)
+ NdisPhysicalMediumFibreChannel
+ NdisPhysicalMedium1394
+ NdisPhysicalMediumWirelessWan
+ NdisPhysicalMediumNative802_11
+ NdisPhysicalMediumBluetooth
+ NdisPhysicalMediumInfiniband
+ NdisPhysicalMediumWiMax
+ NdisPhysicalMediumUWB
+ NdisPhysicalMedium802_3
+ NdisPhysicalMedium802_5
+ NdisPhysicalMediumIrda
+ NdisPhysicalMediumWiredWAN
+ NdisPhysicalMediumWiredCoWan
+ NdisPhysicalMediumOther
+ NdisPhysicalMediumNative802_15_4
+ NdisPhysicalMediumMax
+)
+
+// NetIfAccessType enumeration type specifies the NDIS network interface access type.
+// https://docs.microsoft.com/en-us/windows/desktop/api/ifdef/ne-ifdef-_net_if_access_type
+type NetIfAccessType uint32
+
+const (
+ NetIfAccessLoopback NetIfAccessType = iota + 1
+ NetIfAccessBroadcast
+ NetIfAccessPointToPoint
+ NetIfAccessPointToMultiPoint
+ NetIfAccessMax
+)
+
+// NetIfAdminStatus enumeration type specifies the NDIS network interface administrative status, as described in RFC 2863.
+// https://docs.microsoft.com/en-us/windows/desktop/api/ifdef/ne-ifdef-net_if_admin_status
+type NetIfAdminStatus uint32
+
+const (
+ NetIfAdminStatusUp NetIfAdminStatus = iota + 1
+ NetIfAdminStatusDown
+ NetIfAdminStatusTesting
+)
+
+// NetIfConnectionType enumeration type specifies the NDIS network interface connection type.
+// https://docs.microsoft.com/en-us/windows/desktop/api/ifdef/ne-ifdef-_net_if_connection_type
+type NetIfConnectionType uint32
+
+const (
+ NetIfConnectionDedicated NetIfConnectionType = iota + 1
+ NetIfConnectionPassive
+ NetIfConnectionDemand
+ NetIfConnectionMaximum
+)
+
+// NetIfDirectionType enumeration type specifies the NDIS network interface direction type.
+// https://docs.microsoft.com/en-us/windows/desktop/api/ifdef/ne-ifdef-net_if_direction_type
+type NetIfDirectionType uint32
+
+const (
+ NetIfDirectionSendReceive NetIfDirectionType = iota
+ NetIfDirectionSendOnly
+ NetIfDirectionReceiveOnly
+ NetIfDirectionMaximum
+)
+
+// NetIfMediaConnectState enumeration type specifies the NDIS network interface connection state.
+// https://docs.microsoft.com/en-us/windows/desktop/api/ifdef/ne-ifdef-_net_if_media_connect_state
+type NetIfMediaConnectState uint32
+
+const (
+ MediaConnectStateUnknown NetIfMediaConnectState = iota
+ MediaConnectStateConnected
+ MediaConnectStateDisconnected
+)
+
+// DadState enumeration specifies information about the duplicate address detection (DAD) state for an IPv4 or IPv6 address.
+// https://docs.microsoft.com/en-us/windows/desktop/api/nldef/ne-nldef-nl_dad_state
+type DadState uint32
+
+const (
+ DadStateInvalid DadState = iota
+ DadStateTentative
+ DadStateDuplicate
+ DadStateDeprecated
+ DadStatePreferred
+)
+
+// PrefixOrigin enumeration specifies the origin of an IPv4 or IPv6 address prefix, and is used with the IP_ADAPTER_UNICAST_ADDRESS structure.
+// https://docs.microsoft.com/en-us/windows/desktop/api/nldef/ne-nldef-nl_prefix_origin
+type PrefixOrigin uint32
+
+const (
+ PrefixOriginOther PrefixOrigin = iota
+ PrefixOriginManual
+ PrefixOriginWellKnown
+ PrefixOriginDHCP
+ PrefixOriginRouterAdvertisement
+ PrefixOriginUnchanged = 1 << 4
+)
+
+// LinkLocalAddressBehavior enumeration type defines the link local address behavior.
+// https://docs.microsoft.com/en-us/windows/desktop/api/nldef/ne-nldef-_nl_link_local_address_behavior
+type LinkLocalAddressBehavior int32
+
+const (
+ LinkLocalAddressAlwaysOff LinkLocalAddressBehavior = iota // Never use link locals.
+ LinkLocalAddressDelayed // Use link locals only if no other addresses. (default for IPv4). Legacy mapping: IPAutoconfigurationEnabled.
+ LinkLocalAddressAlwaysOn // Always use link locals (default for IPv6).
+ LinkLocalAddressUnchanged = -1
+)
+
+// OffloadRod enumeration specifies a set of flags that indicate the offload capabilities for an IP interface.
+// https://docs.microsoft.com/en-us/windows/desktop/api/nldef/ns-nldef-_nl_interface_offload_rod
+type OffloadRod uint8
+
+const (
+ ChecksumSupported OffloadRod = 1 << iota
+ OptionsSupported
+ DatagramChecksumSupported
+ StreamChecksumSupported
+ StreamOptionsSupported
+ FastPathCompatible
+ LargeSendOffloadSupported
+ GiantSendOffloadSupported
+)
+
+// RouteOrigin enumeration type defines the origin of the IP route.
+// https://docs.microsoft.com/en-us/windows/desktop/api/nldef/ne-nldef-nl_route_origin
+type RouteOrigin uint32
+
+const (
+ RouteOriginManual RouteOrigin = iota
+ RouteOriginWellKnown
+ RouteOriginDHCP
+ RouteOriginRouterAdvertisement
+ RouteOrigin6to4
+)
+
+// RouteProtocol enumeration type defines the routing mechanism that an IP route was added with, as described in RFC 4292.
+// https://docs.microsoft.com/en-us/windows/desktop/api/nldef/ne-nldef-nl_route_protocol
+type RouteProtocol uint32
+
+const (
+ RouteProtocolOther RouteProtocol = iota + 1
+ RouteProtocolLocal
+ RouteProtocolNetMgmt
+ RouteProtocolIcmp
+ RouteProtocolEgp
+ RouteProtocolGgp
+ RouteProtocolHello
+ RouteProtocolRip
+ RouteProtocolIsIs
+ RouteProtocolEsIs
+ RouteProtocolCisco
+ RouteProtocolBbn
+ RouteProtocolOspf
+ RouteProtocolBgp
+ RouteProtocolIdpr
+ RouteProtocolEigrp
+ RouteProtocolDvmrp
+ RouteProtocolRpl
+ RouteProtocolDHCP
+ RouteProtocolNTAutostatic = 10002
+ RouteProtocolNTStatic = 10006
+ RouteProtocolNTStaticNonDOD = 10007
+)
+
+// RouterDiscoveryBehavior enumeration type defines the router discovery behavior, as described in RFC 2461.
+// https://docs.microsoft.com/en-us/windows/desktop/api/nldef/ne-nldef-_nl_router_discovery_behavior
+type RouterDiscoveryBehavior int32
+
+const (
+ RouterDiscoveryDisabled RouterDiscoveryBehavior = iota
+ RouterDiscoveryEnabled
+ RouterDiscoveryDHCP
+ RouterDiscoveryUnchanged = -1
+)
+
+// SuffixOrigin enumeration specifies the origin of an IPv4 or IPv6 address suffix, and is used with the IP_ADAPTER_UNICAST_ADDRESS structure.
+// https://docs.microsoft.com/en-us/windows/desktop/api/nldef/ne-nldef-nl_suffix_origin
+type SuffixOrigin uint32
+
+const (
+ SuffixOriginOther SuffixOrigin = iota
+ SuffixOriginManual
+ SuffixOriginWellKnown
+ SuffixOriginDHCP
+ SuffixOriginLinkLayerAddress
+ SuffixOriginRandom
+ SuffixOriginUnchanged = 1 << 4
+)
+
+// MibNotificationType enumeration defines the notification type passed to a callback function when a notification occurs.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/ne-netioapi-_mib_notification_type
+type MibNotificationType uint32
+
+const (
+ MibParameterNotification MibNotificationType = iota // Parameter change
+ MibAddInstance // Addition
+ MibDeleteInstance // Deletion
+ MibInitialNotification // Initial notification
+)
+
+// TunnelType enumeration type defines the encapsulation method used by a tunnel, as described by the Internet Assigned Names Authority (IANA).
+// https://docs.microsoft.com/en-us/windows/desktop/api/ifdef/ne-ifdef-tunnel_type
+type TunnelType uint32
+
+const (
+ TunnelTypeNone TunnelType = 0
+ TunnelTypeOther = 1
+ TunnelTypeDirect = 2
+ TunnelType6to4 = 11
+ TunnelTypeIsatap = 13
+ TunnelTypeTeredo = 14
+ TunnelTypeIPHTTPS = 15
+)
+
+// InterfaceAndOperStatusFlags enumeration type defines interface and operation flags
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/ns-netioapi-_mib_if_row2
+type InterfaceAndOperStatusFlags uint8
+
+const (
+ IAOSFHardwareInterface InterfaceAndOperStatusFlags = 1 << iota
+ IAOSFFilterInterface
+ IAOSFConnectorPresent
+ IAOSFNotAuthenticated
+ IAOSFNotMediaConnected
+ IAOSFPaused
+ IAOSFLowPower
+ IAOSFEndPointInterface
+)
+
+// GAAFlags enumeration defines flags used in GetAdaptersAddresses calls
+// https://docs.microsoft.com/en-us/windows/desktop/api/iphlpapi/nf-iphlpapi-getadaptersaddresses
+type GAAFlags uint32
+
+const (
+ GAAFlagSkipUnicast GAAFlags = 1 << iota
+ GAAFlagSkipAnycast
+ GAAFlagSkipMulticast
+ GAAFlagSkipDNSServer
+ GAAFlagIncludePrefix
+ GAAFlagSkipFriendlyName
+ GAAFlagIncludeWinsInfo
+ GAAFlagIncludeGateways
+ GAAFlagIncludeAllInterfaces
+ GAAFlagIncludeAllCompartments
+ GAAFlagIncludeTunnelBindingOrder
+ GAAFlagSkipDNSInfo
+
+ GAAFlagDefault GAAFlags = 0
+ GAAFlagSkipAll = GAAFlagSkipUnicast | GAAFlagSkipAnycast | GAAFlagSkipMulticast | GAAFlagSkipDNSServer | GAAFlagSkipFriendlyName | GAAFlagSkipDNSInfo
+ GAAFlagIncludeAll = GAAFlagIncludePrefix | GAAFlagIncludeWinsInfo | GAAFlagIncludeGateways | GAAFlagIncludeAllInterfaces | GAAFlagIncludeAllCompartments | GAAFlagIncludeTunnelBindingOrder
+)
+
+// ScopeLevel enumeration is used with the IP_ADAPTER_ADDRESSES structure to identify scope levels for IPv6 addresses.
+// https://docs.microsoft.com/en-us/windows/desktop/api/ws2def/ne-ws2def-scope_level
+type ScopeLevel uint32
+
+const (
+ ScopeLevelInterface ScopeLevel = 1
+ ScopeLevelLink = 2
+ ScopeLevelSubnet = 3
+ ScopeLevelAdmin = 4
+ ScopeLevelSite = 5
+ ScopeLevelOrganization = 8
+ ScopeLevelGlobal = 14
+ ScopeLevelCount = 16
+)
+
+// Theoretical array index limitations
+const (
+ maxIndexCount8 = (1 << 31) - 1
+ maxIndexCount16 = (1 << 30) - 1
+)
+
+// RouteData structure describes a route to add
+type RouteData struct {
+ Destination net.IPNet
+ NextHop net.IP
+ Metric uint32
+}
+
+// IPAdapterDNSSuffix structure stores a DNS suffix in a linked list of DNS suffixes for a particular adapter.
+// https://docs.microsoft.com/en-us/windows/desktop/api/iptypes/ns-iptypes-_ip_adapter_dns_suffix
+type IPAdapterDNSSuffix struct {
+ Next *IPAdapterDNSSuffix
+ str [maxDNSSuffixStringLength]uint16
+}
+
+// String method returns the DNS suffix for this DNS suffix entry.
+func (obj *IPAdapterDNSSuffix) String() string {
+ return windows.UTF16ToString(obj.str[:])
+}
+
+// AdapterName method returns the name of the adapter with which these addresses are associated.
+// Unlike an adapter's friendly name, the adapter name returned by AdapterName is permanent and cannot be modified by the user.
+func (addr *IPAdapterAddresses) AdapterName() string {
+ if addr.adapterName == nil {
+ return ""
+ }
+ slice := (*(*[maxIndexCount8]uint8)(unsafe.Pointer(addr.adapterName)))[:]
+ null := bytes.IndexByte(slice, 0)
+ if null != -1 {
+ slice = slice[:null]
+ }
+ return string(slice)
+}
+
+// DNSSuffix method returns adapter DNS suffix associated with this adapter.
+func (addr *IPAdapterAddresses) DNSSuffix() string {
+ if addr.dnsSuffix == nil {
+ return ""
+ }
+ return windows.UTF16ToString((*(*[maxIndexCount16]uint16)(unsafe.Pointer(addr.dnsSuffix)))[:])
+}
+
+// Description method returns description for the adapter.
+func (addr *IPAdapterAddresses) Description() string {
+ if addr.description == nil {
+ return ""
+ }
+ return windows.UTF16ToString((*(*[maxIndexCount16]uint16)(unsafe.Pointer(addr.description)))[:])
+}
+
+// FriendlyName method returns a user-friendly name for the adapter. For example: "Local Area Connection 1."
+// This name appears in contexts such as the ipconfig command line program and the Connection folder.
+func (addr *IPAdapterAddresses) FriendlyName() string {
+ if addr.friendlyName == nil {
+ return ""
+ }
+ return windows.UTF16ToString((*(*[maxIndexCount16]uint16)(unsafe.Pointer(addr.friendlyName)))[:])
+}
+
+// PhysicalAddress method returns the Media Access Control (MAC) address for the adapter.
+// For example, on an Ethernet network this member would specify the Ethernet hardware address.
+func (addr *IPAdapterAddresses) PhysicalAddress() []byte {
+ return addr.physicalAddress[:addr.physicalAddressLength]
+}
+
+// DHCPv6ClientDUID method returns the DHCP unique identifier (DUID) for the DHCPv6 client.
+// This information is only applicable to an IPv6 adapter address configured using DHCPv6.
+func (addr *IPAdapterAddresses) DHCPv6ClientDUID() []byte {
+ return addr.dhcpv6ClientDUID[:addr.dhcpv6ClientDUIDLength]
+}
+
+// Init method initializes the members of an MIB_IPINTERFACE_ROW entry with default values.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/nf-netioapi-initializeipinterfaceentry
+func (row *MibIPInterfaceRow) Init() {
+ initializeIPInterfaceEntry(row)
+}
+
+// get method retrieves IP information for the specified interface on the local computer.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/nf-netioapi-getipinterfaceentry
+func (row *MibIPInterfaceRow) get() error {
+ if err := getIPInterfaceEntry(row); err != nil {
+ return err
+ }
+
+ // Patch that fixes SitePrefixLength issue
+ // https://stackoverflow.com/questions/54857292/setipinterfaceentry-returns-error-invalid-parameter?noredirect=1
+ switch row.Family {
+ case windows.AF_INET:
+ if row.SitePrefixLength > 32 {
+ row.SitePrefixLength = 0
+ }
+ case windows.AF_INET6:
+ if row.SitePrefixLength > 128 {
+ row.SitePrefixLength = 128
+ }
+ }
+
+ return nil
+}
+
+// Set method sets the properties of an IP interface on the local computer.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/nf-netioapi-setipinterfaceentry
+func (row *MibIPInterfaceRow) Set() error {
+ return setIPInterfaceEntry(row)
+}
+
+// get method returns all table rows as a Go slice.
+func (tab *mibIPInterfaceTable) get() []MibIPInterfaceRow {
+ const maxCount = maxIndexCount8 / unsafe.Sizeof(MibIPInterfaceRow{})
+ return (*[maxCount]MibIPInterfaceRow)(unsafe.Pointer(&tab.table[0]))[:tab.numEntries]
+}
+
+// free method frees the buffer allocated by the functions that return tables of network interfaces, addresses, and routes.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/nf-netioapi-freemibtable
+func (tab *mibIPInterfaceTable) free() {
+ freeMibTable(unsafe.Pointer(tab))
+}
+
+// Alias method returns a string that contains the alias name of the network interface.
+func (row *MibIfRow2) Alias() string {
+ return windows.UTF16ToString(row.alias[:])
+}
+
+// Description method returns a string that contains a description of the network interface.
+func (row *MibIfRow2) Description() string {
+ return windows.UTF16ToString(row.description[:])
+}
+
+// PhysicalAddress method returns the physical hardware address of the adapter for this network interface.
+func (row *MibIfRow2) PhysicalAddress() []byte {
+ return row.physicalAddress[:row.physicalAddressLength]
+}
+
+// PermanentPhysicalAddress method returns the permanent physical hardware address of the adapter for this network interface.
+func (row *MibIfRow2) PermanentPhysicalAddress() []byte {
+ return row.permanentPhysicalAddress[:row.physicalAddressLength]
+}
+
+// get method retrieves information for the specified interface on the local computer.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/nf-netioapi-getifentry2
+func (row *MibIfRow2) get() (ret error) {
+ return getIfEntry2(row)
+}
+
+// get method returns all table rows as a Go slice.
+func (tab *mibIfTable2) get() []MibIfRow2 {
+ const maxCount = maxIndexCount8 / unsafe.Sizeof(MibIfRow2{})
+ return (*[maxCount]MibIfRow2)(unsafe.Pointer(&tab.table[0]))[:tab.numEntries]
+}
+
+// free method frees the buffer allocated by the functions that return tables of network interfaces, addresses, and routes.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/nf-netioapi-freemibtable
+func (tab *mibIfTable2) free() {
+ freeMibTable(unsafe.Pointer(tab))
+}
+
+// RawSockaddrInet union contains an IPv4, an IPv6 address, or an address family.
+// https://docs.microsoft.com/en-us/windows/desktop/api/ws2ipdef/ns-ws2ipdef-_sockaddr_inet
+type RawSockaddrInet struct {
+ Family AddressFamily
+ data [26]byte
+}
+
+// SetIP method sets family, address, and port to the given IPv4 or IPv6 address and port.
+// All other members of the structure are set to zero.
+func (addr *RawSockaddrInet) SetIP(ip net.IP, port uint16) error {
+ if v4 := ip.To4(); v4 != nil {
+ addr4 := (*windows.RawSockaddrInet4)(unsafe.Pointer(addr))
+ addr4.Family = windows.AF_INET
+ copy(addr4.Addr[:], v4)
+ addr4.Port = port
+ for i := 0; i < 8; i++ {
+ addr4.Zero[i] = 0
+ }
+ return nil
+ }
+
+ if v6 := ip.To16(); v6 != nil {
+ addr6 := (*windows.RawSockaddrInet6)(unsafe.Pointer(addr))
+ addr6.Family = windows.AF_INET6
+ addr6.Port = port
+ addr6.Flowinfo = 0
+ copy(addr6.Addr[:], v6)
+ addr6.Scope_id = 0
+ return nil
+ }
+
+ return windows.ERROR_INVALID_PARAMETER
+}
+
+// IP method returns IPv4 or IPv6 address.
+// If the address is neither IPv4 not IPv6 nil is returned.
+func (addr *RawSockaddrInet) IP() net.IP {
+ switch addr.Family {
+ case windows.AF_INET:
+ return (*windows.RawSockaddrInet4)(unsafe.Pointer(addr)).Addr[:]
+
+ case windows.AF_INET6:
+ return (*windows.RawSockaddrInet6)(unsafe.Pointer(addr)).Addr[:]
+ }
+
+ return nil
+}
+
+// Init method initializes a MibUnicastIPAddressRow structure with default values for a unicast IP address entry on the local computer.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/nf-netioapi-initializeunicastipaddressentry
+func (row *MibUnicastIPAddressRow) Init() {
+ initializeUnicastIPAddressEntry(row)
+}
+
+// get method retrieves information for an existing unicast IP address entry on the local computer.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/nf-netioapi-getunicastipaddressentry
+func (row *MibUnicastIPAddressRow) get() error {
+ return getUnicastIPAddressEntry(row)
+}
+
+// Set method sets the properties of an existing unicast IP address entry on the local computer.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/nf-netioapi-setunicastipaddressentry
+func (row *MibUnicastIPAddressRow) Set() error {
+ return setUnicastIPAddressEntry(row)
+}
+
+// Create method adds a new unicast IP address entry on the local computer.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/nf-netioapi-createunicastipaddressentry
+func (row *MibUnicastIPAddressRow) Create() error {
+ return createUnicastIPAddressEntry(row)
+}
+
+// Delete method deletes an existing unicast IP address entry on the local computer.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/nf-netioapi-deleteunicastipaddressentry
+func (row *MibUnicastIPAddressRow) Delete() error {
+ return deleteUnicastIPAddressEntry(row)
+}
+
+// get method returns all table rows as a Go slice.
+func (tab *mibUnicastIPAddressTable) get() []MibUnicastIPAddressRow {
+ const maxCount = maxIndexCount8 / unsafe.Sizeof(MibUnicastIPAddressRow{})
+ return (*[maxCount]MibUnicastIPAddressRow)(unsafe.Pointer(&tab.table[0]))[:tab.numEntries]
+}
+
+// free method frees the buffer allocated by the functions that return tables of network interfaces, addresses, and routes.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/nf-netioapi-freemibtable
+func (tab *mibUnicastIPAddressTable) free() {
+ freeMibTable(unsafe.Pointer(tab))
+}
+
+// get method retrieves information for an existing anycast IP address entry on the local computer.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/nf-netioapi-getanycastipaddressentry
+func (row *MibAnycastIPAddressRow) get() error {
+ return getAnycastIPAddressEntry(row)
+}
+
+// Create method adds a new anycast IP address entry on the local computer.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/nf-netioapi-createanycastipaddressentry
+func (row *MibAnycastIPAddressRow) Create() error {
+ return createAnycastIPAddressEntry(row)
+}
+
+// Delete method deletes an existing anycast IP address entry on the local computer.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/nf-netioapi-deleteanycastipaddressentry
+func (row *MibAnycastIPAddressRow) Delete() error {
+ return deleteAnycastIPAddressEntry(row)
+}
+
+// get method returns all table rows as a Go slice.
+func (tab *mibAnycastIPAddressTable) get() []MibAnycastIPAddressRow {
+ const maxCount = maxIndexCount8 / unsafe.Sizeof(MibAnycastIPAddressRow{})
+ return (*[maxCount]MibAnycastIPAddressRow)(unsafe.Pointer(&tab.table[0]))[:tab.numEntries]
+}
+
+// free method frees the buffer allocated by the functions that return tables of network interfaces, addresses, and routes.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/nf-netioapi-freemibtable
+func (tab *mibAnycastIPAddressTable) free() {
+ freeMibTable(unsafe.Pointer(tab))
+}
+
+// IPAddressPrefix structure stores an IP address prefix.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/ns-netioapi-_ip_address_prefix
+type IPAddressPrefix struct {
+ Prefix RawSockaddrInet
+ PrefixLength uint8
+ _ [2]byte
+}
+
+// SetIPNet method sets IP address prefix using net.IPNet.
+func (prefix *IPAddressPrefix) SetIPNet(net net.IPNet) error {
+ err := prefix.Prefix.SetIP(net.IP, 0)
+ if err != nil {
+ return err
+ }
+ ones, _ := net.Mask.Size()
+ prefix.PrefixLength = uint8(ones)
+ return nil
+}
+
+// IPNet method returns IP address prefix as net.IPNet.
+// If the address is neither IPv4 not IPv6 an empty net.IPNet is returned. The resulting net.IPNet should be checked appropriately.
+func (prefix *IPAddressPrefix) IPNet() net.IPNet {
+ switch prefix.Prefix.Family {
+ case windows.AF_INET:
+ return net.IPNet{IP: (*windows.RawSockaddrInet4)(unsafe.Pointer(&prefix.Prefix)).Addr[:], Mask: net.CIDRMask(int(prefix.PrefixLength), 8*net.IPv4len)}
+ case windows.AF_INET6:
+ return net.IPNet{IP: (*windows.RawSockaddrInet6)(unsafe.Pointer(&prefix.Prefix)).Addr[:], Mask: net.CIDRMask(int(prefix.PrefixLength), 8*net.IPv6len)}
+ }
+ return net.IPNet{}
+}
+
+// MibIPforwardRow2 structure stores information about an IP route entry.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/ns-netioapi-_mib_ipforward_row2
+type MibIPforwardRow2 struct {
+ InterfaceLUID LUID
+ InterfaceIndex uint32
+ DestinationPrefix IPAddressPrefix
+ NextHop RawSockaddrInet
+ SitePrefixLength uint8
+ ValidLifetime uint32
+ PreferredLifetime uint32
+ Metric uint32
+ Protocol RouteProtocol
+ Loopback bool
+ AutoconfigureAddress bool
+ Publish bool
+ Immortal bool
+ Age uint32
+ Origin RouteOrigin
+}
+
+// Init method initializes a MIB_IPFORWARD_ROW2 structure with default values for an IP route entry on the local computer.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/nf-netioapi-initializeipforwardentry
+func (row *MibIPforwardRow2) Init() {
+ initializeIPForwardEntry(row)
+}
+
+// get method retrieves information for an IP route entry on the local computer.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/nf-netioapi-getipforwardentry2
+func (row *MibIPforwardRow2) get() error {
+ return getIPForwardEntry2(row)
+}
+
+// Set method sets the properties of an IP route entry on the local computer.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/nf-netioapi-setipforwardentry2
+func (row *MibIPforwardRow2) Set() error {
+ return setIPForwardEntry2(row)
+}
+
+// Create method creates a new IP route entry on the local computer.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/nf-netioapi-createipforwardentry2
+func (row *MibIPforwardRow2) Create() error {
+ return createIPForwardEntry2(row)
+}
+
+// Delete method deletes an IP route entry on the local computer.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/nf-netioapi-deleteipforwardentry2
+func (row *MibIPforwardRow2) Delete() error {
+ return deleteIPForwardEntry2(row)
+}
+
+// get method returns all table rows as a Go slice.
+func (tab *mibIPforwardTable2) get() []MibIPforwardRow2 {
+ const maxCount = maxIndexCount8 / unsafe.Sizeof(MibIPforwardRow2{})
+ return (*[maxCount]MibIPforwardRow2)(unsafe.Pointer(&tab.table[0]))[:tab.numEntries]
+}
+
+// free method frees the buffer allocated by the functions that return tables of network interfaces, addresses, and routes.
+// https://docs.microsoft.com/en-us/windows/desktop/api/netioapi/nf-netioapi-freemibtable
+func (tab *mibIPforwardTable2) free() {
+ freeMibTable(unsafe.Pointer(tab))
+}