|
|
|
@ -86,23 +86,24 @@ func controlC(logf logger.Logf, network, address string, c syscall.RawConn) (err
|
|
|
|
|
var ifaceIdxV4, ifaceIdxV6 uint32
|
|
|
|
|
if useRoute := bindToInterfaceByRoute.Load() || bindToInterfaceByRouteEnv(); useRoute {
|
|
|
|
|
addr, err := parseAddress(address)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("parseAddress: %w", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if canV4 && (addr.Is4() || addr.Is4In6()) {
|
|
|
|
|
addrV4 := addr.Unmap()
|
|
|
|
|
ifaceIdxV4, err = getInterfaceIndex(logf, addrV4, defIfaceIdxV4)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("getInterfaceIndex(%v): %w", addrV4, err)
|
|
|
|
|
if err == nil {
|
|
|
|
|
if canV4 && (addr.Is4() || addr.Is4In6()) {
|
|
|
|
|
addrV4 := addr.Unmap()
|
|
|
|
|
ifaceIdxV4, err = getInterfaceIndex(logf, addrV4, defIfaceIdxV4)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("getInterfaceIndex(%v): %w", addrV4, err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if canV6 && addr.Is6() {
|
|
|
|
|
ifaceIdxV6, err = getInterfaceIndex(logf, addr, defIfaceIdxV6)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("getInterfaceIndex(%v): %w", addr, err)
|
|
|
|
|
if canV6 && addr.Is6() {
|
|
|
|
|
ifaceIdxV6, err = getInterfaceIndex(logf, addr, defIfaceIdxV6)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("getInterfaceIndex(%v): %w", addr, err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
logf("[unexpected] netns: error parsing address %q: %v", address, err)
|
|
|
|
|
ifaceIdxV4, ifaceIdxV6 = defIfaceIdxV4, defIfaceIdxV6
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
ifaceIdxV4, ifaceIdxV6 = defIfaceIdxV4, defIfaceIdxV6
|
|
|
|
|