Source file
src/net/interface_solaris.go
1
2
3
4
5 package net
6
7 import (
8 "syscall"
9
10 "golang.org/x/net/lif"
11 )
12
13
14
15
16 func interfaceTable(ifindex int) ([]Interface, error) {
17 lls, err := lif.Links(syscall.AF_UNSPEC, "")
18 if err != nil {
19 return nil, err
20 }
21 var ift []Interface
22 for _, ll := range lls {
23 if ifindex != 0 && ifindex != ll.Index {
24 continue
25 }
26 ifi := Interface{Index: ll.Index, MTU: ll.MTU, Name: ll.Name, Flags: linkFlags(ll.Flags)}
27 if len(ll.Addr) > 0 {
28 ifi.HardwareAddr = HardwareAddr(ll.Addr)
29 }
30 ift = append(ift, ifi)
31 }
32 return ift, nil
33 }
34
35 func linkFlags(rawFlags int) Flags {
36 var f Flags
37 if rawFlags&syscall.IFF_UP != 0 {
38 f |= FlagUp
39 }
40 if rawFlags&syscall.IFF_RUNNING != 0 {
41 f |= FlagRunning
42 }
43 if rawFlags&syscall.IFF_BROADCAST != 0 {
44 f |= FlagBroadcast
45 }
46 if rawFlags&syscall.IFF_LOOPBACK != 0 {
47 f |= FlagLoopback
48 }
49 if rawFlags&syscall.IFF_POINTOPOINT != 0 {
50 f |= FlagPointToPoint
51 }
52 if rawFlags&syscall.IFF_MULTICAST != 0 {
53 f |= FlagMulticast
54 }
55 return f
56 }
57
58
59
60
61 func interfaceAddrTable(ifi *Interface) ([]Addr, error) {
62 var name string
63 if ifi != nil {
64 name = ifi.Name
65 }
66 as, err := lif.Addrs(syscall.AF_UNSPEC, name)
67 if err != nil {
68 return nil, err
69 }
70 var ifat []Addr
71 for _, a := range as {
72 var ip IP
73 var mask IPMask
74 switch a := a.(type) {
75 case *lif.Inet4Addr:
76 ip = IPv4(a.IP[0], a.IP[1], a.IP[2], a.IP[3])
77 mask = CIDRMask(a.PrefixLen, 8*IPv4len)
78 case *lif.Inet6Addr:
79 ip = make(IP, IPv6len)
80 copy(ip, a.IP[:])
81 mask = CIDRMask(a.PrefixLen, 8*IPv6len)
82 }
83 ifat = append(ifat, &IPNet{IP: ip, Mask: mask})
84 }
85 return ifat, nil
86 }
87
88
89
90 func interfaceMulticastAddrTable(ifi *Interface) ([]Addr, error) {
91 return nil, nil
92 }
93
View as plain text