ip_helper.odin 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. #+build windows
  2. package sys_windows
  3. foreign import "system:iphlpapi.lib"
  4. Address_Family :: enum u32 {
  5. Unspecified = 0, // Return both IPv4 and IPv6 addresses associated with adapters with them enabled.
  6. IPv4 = 2, // Return only IPv4 addresses associated with adapters with it enabled.
  7. IPv6 = 23, // Return only IPv6 addresses associated with adapters with it enabled.
  8. }
  9. GAA_Flag :: enum u32 {
  10. Skip_Unicast = 0, // Do not return unicast addresses.
  11. Skip_Anycast = 1, // Do not return IPv6 anycast addresses.
  12. Skip_Multicast = 2, // Do not return multicast addresses.
  13. Skip_DNS_Server = 3, // Do not return addresses of DNS servers.
  14. Include_Prefix = 4, // (XP SP1+) Return a list of IP address prefixes on this adapter. When this flag is set, IP address prefixes are returned for both IPv6 and IPv4 addresses.
  15. Skip_Friendly_Name = 5, // Do not return the adapter friendly name.
  16. Include_WINS_info = 6, // (Vista+) Return addresses of Windows Internet Name Service (WINS) servers.
  17. Include_Gateways = 7, // (Vista+) Return the addresses of default gateways.
  18. Include_All_Interfaces = 8, // (Vista+) Return addresses for all NDIS interfaces.
  19. Include_All_Compartments = 9, // (Reserved, Unsupported) Return addresses in all routing compartments.
  20. Include_Tunnel_Binding_Order = 10, // (Vista+) Return the adapter addresses sorted in tunnel binding order.
  21. }
  22. GAA_Flags :: bit_set[GAA_Flag; u32]
  23. IP_Adapter_Addresses :: struct {
  24. Raw: struct #raw_union {
  25. Alignment: u64,
  26. Anonymous: struct {
  27. Length: u32,
  28. IfIndex: u32,
  29. },
  30. },
  31. Next: ^IP_Adapter_Addresses,
  32. AdapterName: cstring,
  33. FirstUnicastAddress: ^IP_ADAPTER_UNICAST_ADDRESS_LH,
  34. FirstAnycastAddress: ^IP_ADAPTER_ANYCAST_ADDRESS_XP,
  35. FirstMulticastAddress: ^IP_ADAPTER_MULTICAST_ADDRESS_XP,
  36. FirstDnsServerAddress: ^IP_ADAPTER_DNS_SERVER_ADDRESS_XP,
  37. DnsSuffix: ^u16,
  38. Description: ^u16,
  39. FriendlyName: ^u16,
  40. PhysicalAddress: [8]u8,
  41. PhysicalAddressLength: u32,
  42. Anonymous2: struct #raw_union {
  43. Flags: u32,
  44. Anonymous: struct {
  45. _bitfield: u32,
  46. },
  47. },
  48. MTU: u32,
  49. IfType: u32,
  50. OperStatus: IF_OPER_STATUS,
  51. Ipv6IfIndex: u32,
  52. ZoneIndices: [16]u32,
  53. FirstPrefix: rawptr, // ^IP_ADAPTER_PREFIX_XP,
  54. TransmitLinkSpeed: u64,
  55. ReceiveLinkSpeed: u64,
  56. FirstWinsServerAddress: rawptr, // ^IP_ADAPTER_WINS_SERVER_ADDRESS_LH,
  57. FirstGatewayAddress: ^IP_ADAPTER_GATEWAY_ADDRESS_LH,
  58. Ipv4Metric: u32,
  59. Ipv6Metric: u32,
  60. Luid: NET_LUID_LH,
  61. Dhcpv4Server: SOCKET_ADDRESS,
  62. CompartmentId: u32,
  63. NetworkGuid: GUID,
  64. ConnectionType: NET_IF_CONNECTION_TYPE,
  65. TunnelType: TUNNEL_TYPE,
  66. Dhcpv6Server: SOCKET_ADDRESS,
  67. Dhcpv6ClientDuid: [130]u8,
  68. Dhcpv6ClientDuidLength: u32,
  69. Dhcpv6Iaid: u32,
  70. FirstDnsSuffix: rawptr, // ^IP_ADAPTER_DNS_SUFFIX,
  71. }
  72. IP_ADAPTER_UNICAST_ADDRESS_LH :: struct {
  73. Anonymous: struct #raw_union {
  74. Alignment: u64,
  75. Anonymous: struct {
  76. Length: u32,
  77. Flags: u32,
  78. },
  79. },
  80. Next: ^IP_ADAPTER_UNICAST_ADDRESS_LH,
  81. Address: SOCKET_ADDRESS,
  82. PrefixOrigin: NL_PREFIX_ORIGIN,
  83. SuffixOrigin: NL_SUFFIX_ORIGIN,
  84. DadState: NL_DAD_STATE,
  85. ValidLifetime: u32,
  86. PreferredLifetime: u32,
  87. LeaseLifetime: u32,
  88. OnLinkPrefixLength: u8,
  89. }
  90. IP_ADAPTER_ANYCAST_ADDRESS_XP :: struct {
  91. Anonymous: struct #raw_union {
  92. Alignment: u64,
  93. Anonymous: struct {
  94. Length: u32,
  95. Flags: u32,
  96. },
  97. },
  98. Next: ^IP_ADAPTER_ANYCAST_ADDRESS_XP,
  99. Address: SOCKET_ADDRESS,
  100. }
  101. IP_ADAPTER_MULTICAST_ADDRESS_XP :: struct {
  102. Anonymous: struct #raw_union {
  103. Alignment: u64,
  104. Anonymous: struct {
  105. Length: u32,
  106. Flags: u32,
  107. },
  108. },
  109. Next: ^IP_ADAPTER_MULTICAST_ADDRESS_XP,
  110. Address: SOCKET_ADDRESS,
  111. }
  112. IP_ADAPTER_GATEWAY_ADDRESS_LH :: struct {
  113. Anonymous: struct #raw_union {
  114. Alignment: u64,
  115. Anonymous: struct {
  116. Length: u32,
  117. Reserved: u32,
  118. },
  119. },
  120. Next: ^IP_ADAPTER_GATEWAY_ADDRESS_LH,
  121. Address: SOCKET_ADDRESS,
  122. }
  123. IP_ADAPTER_DNS_SERVER_ADDRESS_XP :: struct {
  124. Anonymous: struct #raw_union {
  125. Alignment: u64,
  126. Anonymous: struct {
  127. Length: u32,
  128. Reserved: u32,
  129. },
  130. },
  131. Next: ^IP_ADAPTER_DNS_SERVER_ADDRESS_XP,
  132. Address: SOCKET_ADDRESS,
  133. }
  134. IF_OPER_STATUS :: enum i32 {
  135. Up = 1,
  136. Down = 2,
  137. Testing = 3,
  138. Unknown = 4,
  139. Dormant = 5,
  140. NotPresent = 6,
  141. LowerLayerDown = 7,
  142. }
  143. NET_LUID_LH :: struct #raw_union {
  144. Value: u64,
  145. Info: struct {
  146. _bitfield: u64,
  147. },
  148. }
  149. SOCKET_ADDRESS :: struct {
  150. lpSockaddr: ^SOCKADDR,
  151. iSockaddrLength: i32,
  152. }
  153. NET_IF_CONNECTION_TYPE :: enum i32 {
  154. NET_IF_CONNECTION_DEDICATED = 1,
  155. NET_IF_CONNECTION_PASSIVE = 2,
  156. NET_IF_CONNECTION_DEMAND = 3,
  157. NET_IF_CONNECTION_MAXIMUM = 4,
  158. }
  159. TUNNEL_TYPE :: enum i32 {
  160. TUNNEL_TYPE_NONE = 0,
  161. TUNNEL_TYPE_OTHER = 1,
  162. TUNNEL_TYPE_DIRECT = 2,
  163. TUNNEL_TYPE_6TO4 = 11,
  164. TUNNEL_TYPE_ISATAP = 13,
  165. TUNNEL_TYPE_TEREDO = 14,
  166. TUNNEL_TYPE_IPHTTPS = 15,
  167. }
  168. NL_PREFIX_ORIGIN :: enum i32 {
  169. IpPrefixOriginOther = 0,
  170. IpPrefixOriginManual = 1,
  171. IpPrefixOriginWellKnown = 2,
  172. IpPrefixOriginDhcp = 3,
  173. IpPrefixOriginRouterAdvertisement = 4,
  174. IpPrefixOriginUnchanged = 16,
  175. }
  176. NL_SUFFIX_ORIGIN :: enum i32 {
  177. NlsoOther = 0,
  178. NlsoManual = 1,
  179. NlsoWellKnown = 2,
  180. NlsoDhcp = 3,
  181. NlsoLinkLayerAddress = 4,
  182. NlsoRandom = 5,
  183. IpSuffixOriginOther = 0,
  184. IpSuffixOriginManual = 1,
  185. IpSuffixOriginWellKnown = 2,
  186. IpSuffixOriginDhcp = 3,
  187. IpSuffixOriginLinkLayerAddress = 4,
  188. IpSuffixOriginRandom = 5,
  189. IpSuffixOriginUnchanged = 16,
  190. }
  191. NL_DAD_STATE :: enum i32 {
  192. NldsInvalid = 0,
  193. NldsTentative = 1,
  194. NldsDuplicate = 2,
  195. NldsDeprecated = 3,
  196. NldsPreferred = 4,
  197. IpDadStateInvalid = 0,
  198. IpDadStateTentative = 1,
  199. IpDadStateDuplicate = 2,
  200. IpDadStateDeprecated = 3,
  201. IpDadStatePreferred = 4,
  202. }
  203. @(default_calling_convention = "system")
  204. foreign iphlpapi {
  205. /*
  206. The GetAdaptersAddresses function retrieves the addresses associated with the adapters on the local computer.
  207. See: https://docs.microsoft.com/en-us/windows/win32/api/iphlpapi/nf-iphlpapi-getadaptersaddresses
  208. */
  209. @(link_name="GetAdaptersAddresses") get_adapters_addresses :: proc(
  210. family: Address_Family,
  211. flags: GAA_Flags,
  212. _reserved: rawptr,
  213. adapter_addresses: [^]IP_Adapter_Addresses,
  214. size: ^u32,
  215. ) -> ULONG ---
  216. }