Copyright 2011 The Go Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
+build darwin dragonfly freebsd netbsd openbsd

package net

import (
	

	
)
If the ifindex is zero, interfaceTable returns mappings of all network interfaces. Otherwise it returns a mapping of a specific interface.
func ( int) ([]Interface, error) {
	,  := interfaceMessages()
	if  != nil {
		return nil, 
	}
	 := len()
	if  != 0 {
		 = 1
	}
	 := make([]Interface, )
	 = 0
	for ,  := range  {
		switch m := .(type) {
		case *route.InterfaceMessage:
			if  != 0 &&  != .Index {
				continue
			}
			[].Index = .Index
			[].Name = .Name
			[].Flags = linkFlags(.Flags)
			if ,  := .Addrs[syscall.RTAX_IFP].(*route.LinkAddr);  && len(.Addr) > 0 {
				[].HardwareAddr = make([]byte, len(.Addr))
				copy([].HardwareAddr, .Addr)
			}
			for ,  := range .Sys() {
				if ,  := .(*route.InterfaceMetrics);  {
					[].MTU = .MTU
					break
				}
			}
			++
			if  == .Index {
				return [:], nil
			}
		}
	}
	return [:], nil
}

func ( int) Flags {
	var  Flags
	if &syscall.IFF_UP != 0 {
		 |= FlagUp
	}
	if &syscall.IFF_BROADCAST != 0 {
		 |= FlagBroadcast
	}
	if &syscall.IFF_LOOPBACK != 0 {
		 |= FlagLoopback
	}
	if &syscall.IFF_POINTOPOINT != 0 {
		 |= FlagPointToPoint
	}
	if &syscall.IFF_MULTICAST != 0 {
		 |= FlagMulticast
	}
	return 
}
If the ifi is nil, interfaceAddrTable returns addresses for all network interfaces. Otherwise it returns addresses for a specific interface.
func ( *Interface) ([]Addr, error) {
	 := 0
	if  != nil {
		 = .Index
	}
	,  := interfaceMessages()
	if  != nil {
		return nil, 
	}
	 := make([]Addr, 0, len())
	for ,  := range  {
		switch m := .(type) {
		case *route.InterfaceAddrMessage:
			if  != 0 &&  != .Index {
				continue
			}
			var  IPMask
			switch sa := .Addrs[syscall.RTAX_NETMASK].(type) {
			case *route.Inet4Addr:
				 = IPv4Mask(.IP[0], .IP[1], .IP[2], .IP[3])
			case *route.Inet6Addr:
				 = make(IPMask, IPv6len)
				copy(, .IP[:])
			}
			var  IP
			switch sa := .Addrs[syscall.RTAX_IFA].(type) {
			case *route.Inet4Addr:
				 = IPv4(.IP[0], .IP[1], .IP[2], .IP[3])
			case *route.Inet6Addr:
				 = make(IP, IPv6len)
				copy(, .IP[:])
			}
			if  != nil &&  != nil { // NetBSD may contain route.LinkAddr
				 = append(, &IPNet{IP: , Mask: })
			}
		}
	}
	return , nil