func interfaceCollector()

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
}