lin
2025-06-05 ed3dd9d3e7519a82bb871d5eedb24a2fa0c91f47
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// Copyright 2016 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.
 
package net
 
import (
   "syscall"
 
   "internal/x/net/lif"
)
 
// If the ifindex is zero, interfaceTable returns mappings of all
// network interfaces. Otherwise it returns a mapping of a specific
// interface.
func interfaceTable(ifindex int) ([]Interface, error) {
   lls, err := lif.Links(syscall.AF_UNSPEC, "")
   if err != nil {
       return nil, err
   }
   var ift []Interface
   for _, ll := range lls {
       if ifindex != 0 && ifindex != ll.Index {
           continue
       }
       ifi := Interface{Index: ll.Index, MTU: ll.MTU, Name: ll.Name, Flags: linkFlags(ll.Flags)}
       if len(ll.Addr) > 0 {
           ifi.HardwareAddr = HardwareAddr(ll.Addr)
       }
       ift = append(ift, ifi)
   }
   return ift, nil
}
 
const (
   sysIFF_UP          = 0x1
   sysIFF_BROADCAST   = 0x2
   sysIFF_DEBUG       = 0x4
   sysIFF_LOOPBACK    = 0x8
   sysIFF_POINTOPOINT = 0x10
   sysIFF_NOTRAILERS  = 0x20
   sysIFF_RUNNING     = 0x40
   sysIFF_NOARP       = 0x80
   sysIFF_PROMISC     = 0x100
   sysIFF_ALLMULTI    = 0x200
   sysIFF_INTELLIGENT = 0x400
   sysIFF_MULTICAST   = 0x800
   sysIFF_MULTI_BCAST = 0x1000
   sysIFF_UNNUMBERED  = 0x2000
   sysIFF_PRIVATE     = 0x8000
)
 
func linkFlags(rawFlags int) Flags {
   var f Flags
   if rawFlags&sysIFF_UP != 0 {
       f |= FlagUp
   }
   if rawFlags&sysIFF_BROADCAST != 0 {
       f |= FlagBroadcast
   }
   if rawFlags&sysIFF_LOOPBACK != 0 {
       f |= FlagLoopback
   }
   if rawFlags&sysIFF_POINTOPOINT != 0 {
       f |= FlagPointToPoint
   }
   if rawFlags&sysIFF_MULTICAST != 0 {
       f |= FlagMulticast
   }
   return f
}
 
// If the ifi is nil, interfaceAddrTable returns addresses for all
// network interfaces. Otherwise it returns addresses for a specific
// interface.
func interfaceAddrTable(ifi *Interface) ([]Addr, error) {
   var name string
   if ifi != nil {
       name = ifi.Name
   }
   as, err := lif.Addrs(syscall.AF_UNSPEC, name)
   if err != nil {
       return nil, err
   }
   var ifat []Addr
   for _, a := range as {
       var ip IP
       var mask IPMask
       switch a := a.(type) {
       case *lif.Inet4Addr:
           ip = IPv4(a.IP[0], a.IP[1], a.IP[2], a.IP[3])
           mask = CIDRMask(a.PrefixLen, 8*IPv4len)
       case *lif.Inet6Addr:
           ip = make(IP, IPv6len)
           copy(ip, a.IP[:])
           mask = CIDRMask(a.PrefixLen, 8*IPv6len)
       }
       ifat = append(ifat, &IPNet{IP: ip, Mask: mask})
   }
   return ifat, nil
}
 
// interfaceMulticastAddrTable returns addresses for a specific
// interface.
func interfaceMulticastAddrTable(ifi *Interface) ([]Addr, error) {
   return nil, nil
}