mirror of
https://github.com/netbirdio/netbird.git
synced 2024-11-26 10:03:47 +01:00
fdd23d4644
Most operating systems add a /32 route for the default gateway address to its routing table This will allow routes to be configured into the system even when the incoming range contains the default gateway. In case a range is a sub-range of an existing route and this range happens to contain the default gateway it attempts to create a default gateway route to prevent loop issues
47 lines
944 B
Go
47 lines
944 B
Go
//go:build windows
|
|
// +build windows
|
|
|
|
package routemanager
|
|
|
|
import (
|
|
"net"
|
|
"net/netip"
|
|
|
|
"github.com/yusufpapurcu/wmi"
|
|
)
|
|
|
|
type Win32_IP4RouteTable struct {
|
|
Destination string
|
|
Mask string
|
|
}
|
|
|
|
func getRoutesFromTable() ([]netip.Prefix, error) {
|
|
var routes []Win32_IP4RouteTable
|
|
query := "SELECT Destination, Mask FROM Win32_IP4RouteTable"
|
|
|
|
err := wmi.Query(query, &routes)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var prefixList []netip.Prefix
|
|
for _, route := range routes {
|
|
addr, err := netip.ParseAddr(route.Destination)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
maskSlice := net.ParseIP(route.Mask).To4()
|
|
if maskSlice == nil {
|
|
continue
|
|
}
|
|
mask := net.IPv4Mask(maskSlice[0], maskSlice[1], maskSlice[2], maskSlice[3])
|
|
cidr, _ := mask.Size()
|
|
|
|
routePrefix := netip.PrefixFrom(addr, cidr)
|
|
if routePrefix.IsValid() && routePrefix.Addr().Is4() {
|
|
prefixList = append(prefixList, routePrefix)
|
|
}
|
|
}
|
|
return prefixList, nil
|
|
}
|