mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
netutil: use ipv4 host by default
Was non-deterministic.
This commit is contained in:
parent
c90c757a56
commit
f97a077257
@ -21,6 +21,7 @@ import (
|
|||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
|
"sort"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
"github.com/coreos/etcd/pkg/cpuutil"
|
"github.com/coreos/etcd/pkg/cpuutil"
|
||||||
@ -38,37 +39,58 @@ func GetDefaultHost() (string, error) {
|
|||||||
return "", rerr
|
return "", rerr
|
||||||
}
|
}
|
||||||
|
|
||||||
for family, rmsg := range rmsgs {
|
// prioritize IPv4
|
||||||
host, oif, err := parsePREFSRC(rmsg)
|
if rmsg, ok := rmsgs[syscall.AF_INET]; ok {
|
||||||
if err != nil {
|
if host, err := chooseHost(syscall.AF_INET, rmsg); host != "" || err != nil {
|
||||||
return "", err
|
return host, err
|
||||||
}
|
|
||||||
if host != "" {
|
|
||||||
return host, nil
|
|
||||||
}
|
}
|
||||||
|
delete(rmsgs, syscall.AF_INET)
|
||||||
|
}
|
||||||
|
|
||||||
// prefsrc not detected, fall back to getting address from iface
|
// sort so choice is deterministic
|
||||||
ifmsg, ierr := getIfaceAddr(oif, family)
|
var families []int
|
||||||
if ierr != nil {
|
for family := range rmsgs {
|
||||||
return "", ierr
|
families = append(families, int(family))
|
||||||
}
|
}
|
||||||
|
sort.Ints(families)
|
||||||
|
|
||||||
attrs, aerr := syscall.ParseNetlinkRouteAttr(ifmsg)
|
for _, f := range families {
|
||||||
if aerr != nil {
|
family := uint8(f)
|
||||||
return "", aerr
|
if host, err := chooseHost(family, rmsgs[family]); host != "" || err != nil {
|
||||||
}
|
return host, err
|
||||||
|
|
||||||
for _, attr := range attrs {
|
|
||||||
// search for RTA_DST because ipv6 doesn't have RTA_SRC
|
|
||||||
if attr.Attr.Type == syscall.RTA_DST {
|
|
||||||
return net.IP(attr.Value).String(), nil
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return "", errNoDefaultHost
|
return "", errNoDefaultHost
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func chooseHost(family uint8, rmsg *syscall.NetlinkMessage) (string, error) {
|
||||||
|
host, oif, err := parsePREFSRC(rmsg)
|
||||||
|
if host != "" || err != nil {
|
||||||
|
return host, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// prefsrc not detected, fall back to getting address from iface
|
||||||
|
ifmsg, ierr := getIfaceAddr(oif, family)
|
||||||
|
if ierr != nil {
|
||||||
|
return "", ierr
|
||||||
|
}
|
||||||
|
|
||||||
|
attrs, aerr := syscall.ParseNetlinkRouteAttr(ifmsg)
|
||||||
|
if aerr != nil {
|
||||||
|
return "", aerr
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, attr := range attrs {
|
||||||
|
// search for RTA_DST because ipv6 doesn't have RTA_SRC
|
||||||
|
if attr.Attr.Type == syscall.RTA_DST {
|
||||||
|
return net.IP(attr.Value).String(), nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
|
||||||
func getDefaultRoutes() (map[uint8]*syscall.NetlinkMessage, error) {
|
func getDefaultRoutes() (map[uint8]*syscall.NetlinkMessage, error) {
|
||||||
dat, err := syscall.NetlinkRIB(syscall.RTM_GETROUTE, syscall.AF_UNSPEC)
|
dat, err := syscall.NetlinkRIB(syscall.RTM_GETROUTE, syscall.AF_UNSPEC)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user