初版功能完成
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
// Package netinfo inspects local IPv4 networks without mutating Windows state.
|
||||
package netinfo
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net"
|
||||
"net/netip"
|
||||
)
|
||||
|
||||
// DirectIPv4Prefixes returns assigned non-loopback IPv4 interface prefixes,
|
||||
// excluding the named RemLink adapter.
|
||||
func DirectIPv4Prefixes(excludedInterface string) ([]netip.Prefix, error) {
|
||||
interfaces, err := net.Interfaces()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("list network interfaces: %w", err)
|
||||
}
|
||||
var prefixes []netip.Prefix
|
||||
for _, networkInterface := range interfaces {
|
||||
if networkInterface.Name == excludedInterface || networkInterface.Flags&net.FlagLoopback != 0 || networkInterface.Flags&net.FlagUp == 0 {
|
||||
continue
|
||||
}
|
||||
addresses, err := networkInterface.Addrs()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("list addresses for %s: %w", networkInterface.Name, err)
|
||||
}
|
||||
for _, address := range addresses {
|
||||
prefix, err := netip.ParsePrefix(address.String())
|
||||
if err != nil || !prefix.Addr().Is4() {
|
||||
continue
|
||||
}
|
||||
prefixes = append(prefixes, prefix.Masked())
|
||||
}
|
||||
}
|
||||
return prefixes, nil
|
||||
}
|
||||
|
||||
// PrefixesOverlap performs true containment-based IPv4 prefix overlap.
|
||||
func PrefixesOverlap(left, right netip.Prefix) bool {
|
||||
if !left.Addr().Is4() || !right.Addr().Is4() {
|
||||
return false
|
||||
}
|
||||
left = left.Masked()
|
||||
right = right.Masked()
|
||||
return left.Contains(right.Addr()) || right.Contains(left.Addr())
|
||||
}
|
||||
|
||||
// FindConflict returns the first local network overlapping desired.
|
||||
func FindConflict(desired netip.Prefix, existing []netip.Prefix) (netip.Prefix, bool) {
|
||||
for _, candidate := range existing {
|
||||
if PrefixesOverlap(desired, candidate) {
|
||||
return candidate, true
|
||||
}
|
||||
}
|
||||
return netip.Prefix{}, false
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
package netinfo
|
||||
|
||||
import (
|
||||
"net/netip"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestPrefixesOverlap(t *testing.T) {
|
||||
for _, test := range []struct {
|
||||
left, right string
|
||||
want bool
|
||||
}{
|
||||
{"192.168.0.0/16", "192.168.13.0/24", true},
|
||||
{"192.168.13.0/24", "192.168.13.10/32", true},
|
||||
{"10.88.0.0/16", "10.89.0.0/16", false},
|
||||
{"0.0.0.0/0", "10.88.0.0/16", true},
|
||||
} {
|
||||
got := PrefixesOverlap(netip.MustParsePrefix(test.left), netip.MustParsePrefix(test.right))
|
||||
if got != test.want {
|
||||
t.Errorf("PrefixesOverlap(%s, %s) = %v, want %v", test.left, test.right, got, test.want)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user