netbird/client/internal/routemanager/systemops_windows.go

58 lines
1.4 KiB
Go
Raw Normal View History

//go:build windows
package routemanager
2023-06-09 19:15:39 +02:00
import (
"fmt"
2023-06-12 11:43:18 +02:00
"net"
2023-06-09 19:15:39 +02:00
"net/netip"
log "github.com/sirupsen/logrus"
2023-06-09 19:17:26 +02:00
"github.com/yusufpapurcu/wmi"
2023-06-09 19:15:39 +02:00
)
type Win32_IP4RouteTable struct {
2023-06-12 11:06:49 +02:00
Destination string
Mask string
2023-06-09 19:15:39 +02:00
}
func getRoutesFromTable() ([]netip.Prefix, error) {
2023-06-09 19:15:39 +02:00
var routes []Win32_IP4RouteTable
2023-06-12 16:22:53 +02:00
query := "SELECT Destination, Mask FROM Win32_IP4RouteTable"
2023-06-09 19:15:39 +02:00
err := wmi.Query(query, &routes)
if err != nil {
return nil, fmt.Errorf("get routes: %w", err)
2023-06-09 19:15:39 +02:00
}
var prefixList []netip.Prefix
2023-06-09 19:15:39 +02:00
for _, route := range routes {
addr, err := netip.ParseAddr(route.Destination)
if err != nil {
log.Warnf("Unable to parse route destination %s: %v", route.Destination, err)
continue
}
maskSlice := net.ParseIP(route.Mask).To4()
if maskSlice == nil {
log.Warnf("Unable to parse route mask %s", route.Mask)
continue
}
mask := net.IPv4Mask(maskSlice[0], maskSlice[1], maskSlice[2], maskSlice[3])
2023-06-12 11:43:18 +02:00
cidr, _ := mask.Size()
routePrefix := netip.PrefixFrom(addr, cidr)
if routePrefix.IsValid() && routePrefix.Addr().Is4() {
prefixList = append(prefixList, routePrefix)
2023-06-12 11:43:18 +02:00
}
2023-06-09 19:15:39 +02:00
}
return prefixList, nil
2023-06-09 19:15:39 +02:00
}
func addToRouteTableIfNoExists(prefix netip.Prefix, addr string, intf string) error {
return genericAddToRouteTableIfNoExists(prefix, addr, intf)
}
func removeFromRouteTableIfNonSystem(prefix netip.Prefix, addr string, intf string) error {
return genericRemoveFromRouteTableIfNonSystem(prefix, addr, intf)
}