pkg/netutil/routes_linux.go
func GetDefaultInterfaces() (map[string]uint8, error) {
	interfaces := make(map[string]uint8)
	rmsgs, rerr := getDefaultRoutes()
	if rerr != nil {
		return interfaces, rerr
	}

	for family, rmsg := range rmsgs {
		_, oif, err := parsePREFSRC(rmsg)
		if err != nil {
			return interfaces, err
		}

		ifmsg, ierr := getIfaceLink(oif)
		if ierr != nil {
			return interfaces, ierr
		}

		attrs, aerr := syscall.ParseNetlinkRouteAttr(ifmsg)
		if aerr != nil {
			return interfaces, aerr
		}

		for _, attr := range attrs {
			if attr.Attr.Type == syscall.IFLA_IFNAME {
				// key is an interface name
				// possible values: 2 - AF_INET, 10 - AF_INET6, 12 - dualstack
				interfaces[string(attr.Value[:len(attr.Value)-1])] += family
			}
		}
	}
	if len(interfaces) > 0 {
		return interfaces, nil
	}
	return interfaces, errNoDefaultInterface
}
func GetDefaultInterfaces() (map[string]uint8, error) {
	interfaces := make(map[string]uint8)
	rmsgs, rerr := getDefaultRoutes()
	if rerr != nil {
		return interfaces, rerr
	}

	for family, rmsg := range rmsgs {
		_, oif, err := parsePREFSRC(rmsg)
		if err != nil {
			return interfaces, err
		}

		ifmsg, ierr := getIfaceLink(oif)
		if ierr != nil {
			return interfaces, ierr
		}

		attrs, aerr := syscall.ParseNetlinkRouteAttr(ifmsg)
		if aerr != nil {
			return interfaces, aerr
		}

		for _, attr := range attrs {
			if attr.Attr.Type == syscall.IFLA_IFNAME {
				// key is an interface name
				// possible values: 2 - AF_INET, 10 - AF_INET6, 12 - dualstack
				interfaces[string(attr.Value[:len(attr.Value)-1])] += family
			}
		}
	}
	if len(interfaces) > 0 {
		return interfaces, nil
	}
	return interfaces, errNoDefaultInterface
}
func GetDefaultInterfaces ( ) ( map [ string ] uint8 , error ) { interfaces := make ( map [ string ] uint8 ) rmsgs , rerr := getDefaultRoutes ( ) if rerr != nil { return interfaces , rerr } for family , rmsg := range rmsgs { _ , oif , err := parsePREFSRC ( rmsg ) if err != nil { return interfaces , err } ifmsg , ierr := getIfaceLink ( oif ) if ierr != nil { return interfaces , ierr } attrs , aerr := syscall . ParseNetlinkRouteAttr ( ifmsg ) if aerr != nil { return interfaces , aerr } for _ , attr := range attrs { if attr . Attr . Type == syscall . IFLA_IFNAME { // key is an interface name // possible values: 2 - AF_INET, 10 - AF_INET6, 12 - dualstack interfaces [ string ( attr . Value [ : len ( attr . Value ) - 1 ] ) ] += family } } } if len ( interfaces ) > 0 { return interfaces , nil } return interfaces , errNoDefaultInterface }
// GetDefaultInterfaces gets names of interfaces and returns a map[interface]families.
GetDefaultInterfaces gets names of interfaces and returns a map [ interface ] families .