in pkg/skoop/collector/podcollector/collector.go [364:443]
func interfaceCollector(sandboxInfo *netstack.NetNSInfo) error {
links, err := netlink.LinkList()
if err != nil {
return err
}
for _, l := range links {
attr := netstack.Interface{
Name: l.Attrs().Name,
Index: l.Attrs().Index,
MTU: l.Attrs().MTU,
Driver: l.Type(),
Addrs: []netstack.Addr{},
NeighInfo: []netstack.Neigh{},
FdbInfo: []netstack.Neigh{},
MasterIndex: l.Attrs().MasterIndex,
PeerIndex: l.Attrs().ParentIndex,
}
switch l.Attrs().OperState {
case netlink.OperUp:
attr.State = netstack.LinkUP
case netlink.OperDown:
attr.State = netstack.LinkDown
default:
if l.Attrs().Flags&net.FlagUp != 0 {
attr.State = netstack.LinkUP
} else {
attr.State = netstack.LinkUnknown
}
}
addrs, err := netlink.AddrList(l, netlink.FAMILY_ALL)
if err != nil {
return err
}
for _, addr := range addrs {
attr.Addrs = append(attr.Addrs, netstack.Addr{
IPNet: addr.IPNet,
})
}
sysctlsStr, err := namespaceCmd(sandboxInfo.PID, fmt.Sprintf("sysctl -a | grep '\\.%s\\.' || true", l.Attrs().Name))
if err != nil {
return err
}
attr.DevSysctls = parseSysctls(sysctlsStr)
fdbs, err := netlink.NeighList(l.Attrs().Index, syscall.AF_BRIDGE)
if err != nil {
return err
}
for _, fdb := range fdbs {
attr.FdbInfo = append(attr.FdbInfo, netstack.Neigh{
Family: syscall.AF_BRIDGE,
LinkIndex: l.Attrs().Index,
State: fdb.State,
Type: fdb.Type,
Flags: fdb.Flags,
IP: fdb.IP,
HardwareAddr: fdb.HardwareAddr,
})
}
neighs, err := netlink.NeighList(l.Attrs().Index, netlink.FAMILY_V4)
if err != nil {
return err
}
for _, neigh := range neighs {
attr.NeighInfo = append(attr.NeighInfo, netstack.Neigh{
Family: netlink.FAMILY_V4,
LinkIndex: l.Attrs().Index,
State: neigh.State,
Type: neigh.Type,
Flags: neigh.Flags,
IP: neigh.IP,
HardwareAddr: neigh.HardwareAddr,
})
}
sandboxInfo.Interfaces = append(sandboxInfo.Interfaces, attr)
}
return nil
}