初版功能完成
ci / Go checks (ubuntu-latest) (push) Has been cancelled
ci / Go checks (windows-latest) (push) Has been cancelled

This commit is contained in:
qsc
2026-08-29 13:12:17 +08:00
commit 142e5dc7d6
217 changed files with 21313 additions and 0 deletions
@@ -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)
}
}
}