mirror of
https://github.com/golang/sys.git
synced 2026-01-29 07:02:06 +03:00
windows: add iphlpapi routing functions
NotifyRouteChange2 registers to be notified for changes to IP route entries. Call GetIpForwardEntry2 on received row to retrieve complete information. GetIpForwardTable2 retrieves the full routing table. FreeMibTable frees the buffer allocated by the functions that return tables of network interfaces, addresses, and routes. Change-Id: I9fba75f1f728661e45dc3092e35eb9099b0570dd Reviewed-on: https://go-review.googlesource.com/c/sys/+/695195 Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> Reviewed-by: Quim Muntal <quimmuntal@gmail.com> Reviewed-by: Michael Pratt <mpratt@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
committed by
Quim Muntal
parent
28c5bda5d4
commit
ea436ef09d
@@ -892,8 +892,12 @@ const socket_error = uintptr(^uint32(0))
|
|||||||
//sys MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) = kernel32.MultiByteToWideChar
|
//sys MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) = kernel32.MultiByteToWideChar
|
||||||
//sys getBestInterfaceEx(sockaddr unsafe.Pointer, pdwBestIfIndex *uint32) (errcode error) = iphlpapi.GetBestInterfaceEx
|
//sys getBestInterfaceEx(sockaddr unsafe.Pointer, pdwBestIfIndex *uint32) (errcode error) = iphlpapi.GetBestInterfaceEx
|
||||||
//sys GetIfEntry2Ex(level uint32, row *MibIfRow2) (errcode error) = iphlpapi.GetIfEntry2Ex
|
//sys GetIfEntry2Ex(level uint32, row *MibIfRow2) (errcode error) = iphlpapi.GetIfEntry2Ex
|
||||||
|
//sys GetIpForwardEntry2(row *MibIpForwardRow2) (errcode error) = iphlpapi.GetIpForwardEntry2
|
||||||
|
//sys GetIpForwardTable2(family uint16, table **MibIpForwardTable2) (errcode error) = iphlpapi.GetIpForwardTable2
|
||||||
//sys GetUnicastIpAddressEntry(row *MibUnicastIpAddressRow) (errcode error) = iphlpapi.GetUnicastIpAddressEntry
|
//sys GetUnicastIpAddressEntry(row *MibUnicastIpAddressRow) (errcode error) = iphlpapi.GetUnicastIpAddressEntry
|
||||||
|
//sys FreeMibTable(memory unsafe.Pointer) = iphlpapi.FreeMibTable
|
||||||
//sys NotifyIpInterfaceChange(family uint16, callback uintptr, callerContext unsafe.Pointer, initialNotification bool, notificationHandle *Handle) (errcode error) = iphlpapi.NotifyIpInterfaceChange
|
//sys NotifyIpInterfaceChange(family uint16, callback uintptr, callerContext unsafe.Pointer, initialNotification bool, notificationHandle *Handle) (errcode error) = iphlpapi.NotifyIpInterfaceChange
|
||||||
|
//sys NotifyRouteChange2(family uint16, callback uintptr, callerContext unsafe.Pointer, initialNotification bool, notificationHandle *Handle) (errcode error) = iphlpapi.NotifyRouteChange2
|
||||||
//sys NotifyUnicastIpAddressChange(family uint16, callback uintptr, callerContext unsafe.Pointer, initialNotification bool, notificationHandle *Handle) (errcode error) = iphlpapi.NotifyUnicastIpAddressChange
|
//sys NotifyUnicastIpAddressChange(family uint16, callback uintptr, callerContext unsafe.Pointer, initialNotification bool, notificationHandle *Handle) (errcode error) = iphlpapi.NotifyUnicastIpAddressChange
|
||||||
//sys CancelMibChangeNotify2(notificationHandle Handle) (errcode error) = iphlpapi.CancelMibChangeNotify2
|
//sys CancelMibChangeNotify2(notificationHandle Handle) (errcode error) = iphlpapi.CancelMibChangeNotify2
|
||||||
|
|
||||||
@@ -916,6 +920,17 @@ type RawSockaddrInet6 struct {
|
|||||||
Scope_id uint32
|
Scope_id uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RawSockaddrInet is a union that contains an IPv4, an IPv6 address, or an address family. See
|
||||||
|
// https://learn.microsoft.com/en-us/windows/win32/api/ws2ipdef/ns-ws2ipdef-sockaddr_inet.
|
||||||
|
//
|
||||||
|
// A [*RawSockaddrInet] may be converted to a [*RawSockaddrInet4] or [*RawSockaddrInet6] using
|
||||||
|
// unsafe, depending on the address family.
|
||||||
|
type RawSockaddrInet struct {
|
||||||
|
Family uint16
|
||||||
|
Port uint16
|
||||||
|
Data [6]uint32
|
||||||
|
}
|
||||||
|
|
||||||
type RawSockaddr struct {
|
type RawSockaddr struct {
|
||||||
Family uint16
|
Family uint16
|
||||||
Data [14]int8
|
Data [14]int8
|
||||||
|
|||||||
@@ -2320,6 +2320,82 @@ type MibIfRow2 struct {
|
|||||||
OutQLen uint64
|
OutQLen uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IP_ADDRESS_PREFIX stores an IP address prefix. See
|
||||||
|
// https://learn.microsoft.com/en-us/windows/win32/api/netioapi/ns-netioapi-ip_address_prefix.
|
||||||
|
type IpAddressPrefix struct {
|
||||||
|
Prefix RawSockaddrInet
|
||||||
|
PrefixLength uint8
|
||||||
|
}
|
||||||
|
|
||||||
|
// NL_ROUTE_ORIGIN enumeration from nldef.h or
|
||||||
|
// https://learn.microsoft.com/en-us/windows/win32/api/nldef/ne-nldef-nl_route_origin.
|
||||||
|
const (
|
||||||
|
NlroManual = 0
|
||||||
|
NlroWellKnown = 1
|
||||||
|
NlroDHCP = 2
|
||||||
|
NlroRouterAdvertisement = 3
|
||||||
|
Nlro6to4 = 4
|
||||||
|
)
|
||||||
|
|
||||||
|
// NL_ROUTE_ORIGIN enumeration from nldef.h or
|
||||||
|
// https://learn.microsoft.com/en-us/windows/win32/api/nldef/ne-nldef-nl_route_protocol.
|
||||||
|
const (
|
||||||
|
MIB_IPPROTO_OTHER = 1
|
||||||
|
MIB_IPPROTO_LOCAL = 2
|
||||||
|
MIB_IPPROTO_NETMGMT = 3
|
||||||
|
MIB_IPPROTO_ICMP = 4
|
||||||
|
MIB_IPPROTO_EGP = 5
|
||||||
|
MIB_IPPROTO_GGP = 6
|
||||||
|
MIB_IPPROTO_HELLO = 7
|
||||||
|
MIB_IPPROTO_RIP = 8
|
||||||
|
MIB_IPPROTO_IS_IS = 9
|
||||||
|
MIB_IPPROTO_ES_IS = 10
|
||||||
|
MIB_IPPROTO_CISCO = 11
|
||||||
|
MIB_IPPROTO_BBN = 12
|
||||||
|
MIB_IPPROTO_OSPF = 13
|
||||||
|
MIB_IPPROTO_BGP = 14
|
||||||
|
MIB_IPPROTO_IDPR = 15
|
||||||
|
MIB_IPPROTO_EIGRP = 16
|
||||||
|
MIB_IPPROTO_DVMRP = 17
|
||||||
|
MIB_IPPROTO_RPL = 18
|
||||||
|
MIB_IPPROTO_DHCP = 19
|
||||||
|
MIB_IPPROTO_NT_AUTOSTATIC = 10002
|
||||||
|
MIB_IPPROTO_NT_STATIC = 10006
|
||||||
|
MIB_IPPROTO_NT_STATIC_NON_DOD = 10007
|
||||||
|
)
|
||||||
|
|
||||||
|
// MIB_IPFORWARD_ROW2 stores information about an IP route entry. See
|
||||||
|
// https://learn.microsoft.com/en-us/windows/win32/api/netioapi/ns-netioapi-mib_ipforward_row2.
|
||||||
|
type MibIpForwardRow2 struct {
|
||||||
|
InterfaceLuid uint64
|
||||||
|
InterfaceIndex uint32
|
||||||
|
DestinationPrefix IpAddressPrefix
|
||||||
|
NextHop RawSockaddrInet
|
||||||
|
SitePrefixLength uint8
|
||||||
|
ValidLifetime uint32
|
||||||
|
PreferredLifetime uint32
|
||||||
|
Metric uint32
|
||||||
|
Protocol uint32
|
||||||
|
Loopback uint8
|
||||||
|
AutoconfigureAddress uint8
|
||||||
|
Publish uint8
|
||||||
|
Immortal uint8
|
||||||
|
Age uint32
|
||||||
|
Origin uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
// MIB_IPFORWARD_TABLE2 contains a table of IP route entries. See
|
||||||
|
// https://learn.microsoft.com/en-us/windows/win32/api/netioapi/ns-netioapi-mib_ipforward_table2.
|
||||||
|
type MibIpForwardTable2 struct {
|
||||||
|
NumEntries uint32
|
||||||
|
Table [1]MibIpForwardRow2
|
||||||
|
}
|
||||||
|
|
||||||
|
// Rows returns the IP route entries in the table.
|
||||||
|
func (t *MibIpForwardTable2) Rows() []MibIpForwardRow2 {
|
||||||
|
return unsafe.Slice(&t.Table[0], t.NumEntries)
|
||||||
|
}
|
||||||
|
|
||||||
// MIB_UNICASTIPADDRESS_ROW stores information about a unicast IP address. See
|
// MIB_UNICASTIPADDRESS_ROW stores information about a unicast IP address. See
|
||||||
// https://learn.microsoft.com/en-us/windows/win32/api/netioapi/ns-netioapi-mib_unicastipaddress_row.
|
// https://learn.microsoft.com/en-us/windows/win32/api/netioapi/ns-netioapi-mib_unicastipaddress_row.
|
||||||
type MibUnicastIpAddressRow struct {
|
type MibUnicastIpAddressRow struct {
|
||||||
|
|||||||
@@ -182,13 +182,17 @@ var (
|
|||||||
procDwmGetWindowAttribute = moddwmapi.NewProc("DwmGetWindowAttribute")
|
procDwmGetWindowAttribute = moddwmapi.NewProc("DwmGetWindowAttribute")
|
||||||
procDwmSetWindowAttribute = moddwmapi.NewProc("DwmSetWindowAttribute")
|
procDwmSetWindowAttribute = moddwmapi.NewProc("DwmSetWindowAttribute")
|
||||||
procCancelMibChangeNotify2 = modiphlpapi.NewProc("CancelMibChangeNotify2")
|
procCancelMibChangeNotify2 = modiphlpapi.NewProc("CancelMibChangeNotify2")
|
||||||
|
procFreeMibTable = modiphlpapi.NewProc("FreeMibTable")
|
||||||
procGetAdaptersAddresses = modiphlpapi.NewProc("GetAdaptersAddresses")
|
procGetAdaptersAddresses = modiphlpapi.NewProc("GetAdaptersAddresses")
|
||||||
procGetAdaptersInfo = modiphlpapi.NewProc("GetAdaptersInfo")
|
procGetAdaptersInfo = modiphlpapi.NewProc("GetAdaptersInfo")
|
||||||
procGetBestInterfaceEx = modiphlpapi.NewProc("GetBestInterfaceEx")
|
procGetBestInterfaceEx = modiphlpapi.NewProc("GetBestInterfaceEx")
|
||||||
procGetIfEntry = modiphlpapi.NewProc("GetIfEntry")
|
procGetIfEntry = modiphlpapi.NewProc("GetIfEntry")
|
||||||
procGetIfEntry2Ex = modiphlpapi.NewProc("GetIfEntry2Ex")
|
procGetIfEntry2Ex = modiphlpapi.NewProc("GetIfEntry2Ex")
|
||||||
|
procGetIpForwardEntry2 = modiphlpapi.NewProc("GetIpForwardEntry2")
|
||||||
|
procGetIpForwardTable2 = modiphlpapi.NewProc("GetIpForwardTable2")
|
||||||
procGetUnicastIpAddressEntry = modiphlpapi.NewProc("GetUnicastIpAddressEntry")
|
procGetUnicastIpAddressEntry = modiphlpapi.NewProc("GetUnicastIpAddressEntry")
|
||||||
procNotifyIpInterfaceChange = modiphlpapi.NewProc("NotifyIpInterfaceChange")
|
procNotifyIpInterfaceChange = modiphlpapi.NewProc("NotifyIpInterfaceChange")
|
||||||
|
procNotifyRouteChange2 = modiphlpapi.NewProc("NotifyRouteChange2")
|
||||||
procNotifyUnicastIpAddressChange = modiphlpapi.NewProc("NotifyUnicastIpAddressChange")
|
procNotifyUnicastIpAddressChange = modiphlpapi.NewProc("NotifyUnicastIpAddressChange")
|
||||||
procAddDllDirectory = modkernel32.NewProc("AddDllDirectory")
|
procAddDllDirectory = modkernel32.NewProc("AddDllDirectory")
|
||||||
procAssignProcessToJobObject = modkernel32.NewProc("AssignProcessToJobObject")
|
procAssignProcessToJobObject = modkernel32.NewProc("AssignProcessToJobObject")
|
||||||
@@ -1624,6 +1628,11 @@ func CancelMibChangeNotify2(notificationHandle Handle) (errcode error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func FreeMibTable(memory unsafe.Pointer) {
|
||||||
|
syscall.SyscallN(procFreeMibTable.Addr(), uintptr(memory))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) {
|
func GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) {
|
||||||
r0, _, _ := syscall.SyscallN(procGetAdaptersAddresses.Addr(), uintptr(family), uintptr(flags), uintptr(reserved), uintptr(unsafe.Pointer(adapterAddresses)), uintptr(unsafe.Pointer(sizePointer)))
|
r0, _, _ := syscall.SyscallN(procGetAdaptersAddresses.Addr(), uintptr(family), uintptr(flags), uintptr(reserved), uintptr(unsafe.Pointer(adapterAddresses)), uintptr(unsafe.Pointer(sizePointer)))
|
||||||
if r0 != 0 {
|
if r0 != 0 {
|
||||||
@@ -1664,6 +1673,22 @@ func GetIfEntry2Ex(level uint32, row *MibIfRow2) (errcode error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func GetIpForwardEntry2(row *MibIpForwardRow2) (errcode error) {
|
||||||
|
r0, _, _ := syscall.SyscallN(procGetIpForwardEntry2.Addr(), uintptr(unsafe.Pointer(row)))
|
||||||
|
if r0 != 0 {
|
||||||
|
errcode = syscall.Errno(r0)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetIpForwardTable2(family uint16, table **MibIpForwardTable2) (errcode error) {
|
||||||
|
r0, _, _ := syscall.SyscallN(procGetIpForwardTable2.Addr(), uintptr(family), uintptr(unsafe.Pointer(table)))
|
||||||
|
if r0 != 0 {
|
||||||
|
errcode = syscall.Errno(r0)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func GetUnicastIpAddressEntry(row *MibUnicastIpAddressRow) (errcode error) {
|
func GetUnicastIpAddressEntry(row *MibUnicastIpAddressRow) (errcode error) {
|
||||||
r0, _, _ := syscall.SyscallN(procGetUnicastIpAddressEntry.Addr(), uintptr(unsafe.Pointer(row)))
|
r0, _, _ := syscall.SyscallN(procGetUnicastIpAddressEntry.Addr(), uintptr(unsafe.Pointer(row)))
|
||||||
if r0 != 0 {
|
if r0 != 0 {
|
||||||
@@ -1684,6 +1709,18 @@ func NotifyIpInterfaceChange(family uint16, callback uintptr, callerContext unsa
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NotifyRouteChange2(family uint16, callback uintptr, callerContext unsafe.Pointer, initialNotification bool, notificationHandle *Handle) (errcode error) {
|
||||||
|
var _p0 uint32
|
||||||
|
if initialNotification {
|
||||||
|
_p0 = 1
|
||||||
|
}
|
||||||
|
r0, _, _ := syscall.SyscallN(procNotifyRouteChange2.Addr(), uintptr(family), uintptr(callback), uintptr(callerContext), uintptr(_p0), uintptr(unsafe.Pointer(notificationHandle)))
|
||||||
|
if r0 != 0 {
|
||||||
|
errcode = syscall.Errno(r0)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func NotifyUnicastIpAddressChange(family uint16, callback uintptr, callerContext unsafe.Pointer, initialNotification bool, notificationHandle *Handle) (errcode error) {
|
func NotifyUnicastIpAddressChange(family uint16, callback uintptr, callerContext unsafe.Pointer, initialNotification bool, notificationHandle *Handle) (errcode error) {
|
||||||
var _p0 uint32
|
var _p0 uint32
|
||||||
if initialNotification {
|
if initialNotification {
|
||||||
|
|||||||
Reference in New Issue
Block a user