diff options
Diffstat (limited to 'src/pkg/net/interface_freebsd.go')
| -rw-r--r-- | src/pkg/net/interface_freebsd.go | 35 | 
1 files changed, 14 insertions, 21 deletions
| diff --git a/src/pkg/net/interface_freebsd.go b/src/pkg/net/interface_freebsd.go index 3cba28fc6..1bf5ae72b 100644 --- a/src/pkg/net/interface_freebsd.go +++ b/src/pkg/net/interface_freebsd.go @@ -2,8 +2,6 @@  // Use of this source code is governed by a BSD-style  // license that can be found in the LICENSE file. -// Network interface identification for FreeBSD -  package net  import ( @@ -11,26 +9,23 @@ import (  	"syscall"  ) -// If the ifindex is zero, interfaceMulticastAddrTable returns -// addresses for all network interfaces.  Otherwise it returns -// addresses for a specific interface. -func interfaceMulticastAddrTable(ifindex int) ([]Addr, error) { -	tab, err := syscall.RouteRIB(syscall.NET_RT_IFMALIST, ifindex) +// interfaceMulticastAddrTable returns addresses for a specific +// interface. +func interfaceMulticastAddrTable(ifi *Interface) ([]Addr, error) { +	tab, err := syscall.RouteRIB(syscall.NET_RT_IFMALIST, ifi.Index)  	if err != nil {  		return nil, os.NewSyscallError("route rib", err)  	} -  	msgs, err := syscall.ParseRoutingMessage(tab)  	if err != nil {  		return nil, os.NewSyscallError("route message", err)  	} -  	var ifmat []Addr  	for _, m := range msgs { -		switch v := m.(type) { +		switch m := m.(type) {  		case *syscall.InterfaceMulticastAddrMessage: -			if ifindex == 0 || ifindex == int(v.Header.Index) { -				ifma, err := newMulticastAddr(v) +			if ifi.Index == int(m.Header.Index) { +				ifma, err := newMulticastAddr(ifi, m)  				if err != nil {  					return nil, err  				} @@ -41,27 +36,25 @@ func interfaceMulticastAddrTable(ifindex int) ([]Addr, error) {  	return ifmat, nil  } -func newMulticastAddr(m *syscall.InterfaceMulticastAddrMessage) ([]Addr, error) { +func newMulticastAddr(ifi *Interface, m *syscall.InterfaceMulticastAddrMessage) ([]Addr, error) {  	sas, err := syscall.ParseRoutingSockaddr(m)  	if err != nil {  		return nil, os.NewSyscallError("route sockaddr", err)  	} -  	var ifmat []Addr -	for _, s := range sas { -		switch v := s.(type) { +	for _, sa := range sas { +		switch sa := sa.(type) {  		case *syscall.SockaddrInet4: -			ifma := &IPAddr{IP: IPv4(v.Addr[0], v.Addr[1], v.Addr[2], v.Addr[3])} +			ifma := &IPAddr{IP: IPv4(sa.Addr[0], sa.Addr[1], sa.Addr[2], sa.Addr[3])}  			ifmat = append(ifmat, ifma.toAddr())  		case *syscall.SockaddrInet6:  			ifma := &IPAddr{IP: make(IP, IPv6len)} -			copy(ifma.IP, v.Addr[:]) +			copy(ifma.IP, sa.Addr[:])  			// NOTE: KAME based IPv6 protcol stack usually embeds  			// the interface index in the interface-local or link-  			// local address as the kernel-internal form. -			if ifma.IP.IsInterfaceLocalMulticast() || -				ifma.IP.IsLinkLocalMulticast() { -				// remove embedded scope zone ID +			if ifma.IP.IsInterfaceLocalMulticast() || ifma.IP.IsLinkLocalMulticast() { +				ifma.Zone = ifi.Name  				ifma.IP[2], ifma.IP[3] = 0, 0  			}  			ifmat = append(ifmat, ifma.toAddr()) | 
