func IOCounters(pernic bool) ([]IOCountersStat, error) { ifs, err := net.Interfaces() if err != nil { return nil, err } var ret []IOCountersStat for _, ifi := range ifs { c := IOCountersStat{ Name: ifi.Name, } row := syscall.MibIfRow{Index: uint32(ifi.Index)} e := syscall.GetIfEntry(&row) if e != nil { return nil, os.NewSyscallError("GetIfEntry", e) } c.BytesSent = uint64(row.OutOctets) c.BytesRecv = uint64(row.InOctets) c.PacketsSent = uint64(row.OutUcastPkts) c.PacketsRecv = uint64(row.InUcastPkts) c.Errin = uint64(row.InErrors) c.Errout = uint64(row.OutErrors) c.Dropin = uint64(row.InDiscards) c.Dropout = uint64(row.OutDiscards) ret = append(ret, c) } if pernic == false { return getIOCountersAll(ret) } return ret, nil }
func queryIOCounters(iface net.Interface, freq time.Duration, qio QueryIO) { for { var row syscall.MibIfRow select { case <-time.After(freq): row.Index = uint32(iface.Index) err := syscall.GetIfEntry(&row) if err != nil { log.Fatal(err) } ioc := &IOCounters{ Name: iface.Name, BytesSent: sysmon.Size(row.OutOctets), BytesRecv: sysmon.Size(row.InOctets), PacketsSent: row.OutUcastPkts, PacketsRecv: row.InUcastPkts, Errin: row.InErrors, Errout: row.OutErrors, Dropin: row.InDiscards, Dropout: row.OutDiscards, } qio.IOCounterChan <- ioc case <-qio.quit: // we have received a signal to stop return } } }
func NetIOCounters(pernic bool) ([]NetIOCountersStat, error) { ifs, err := net.Interfaces() if err != nil { return nil, err } ai, err := getAdapterList() if err != nil { return nil, err } var ret []NetIOCountersStat for _, ifi := range ifs { name := ifi.Name for ; ai != nil; ai = ai.Next { name = common.BytePtrToString(&ai.Description[0]) c := NetIOCountersStat{ Name: name, } row := syscall.MibIfRow{Index: ai.Index} e := syscall.GetIfEntry(&row) if e != nil { return nil, os.NewSyscallError("GetIfEntry", e) } c.BytesSent = uint64(row.OutOctets) c.BytesRecv = uint64(row.InOctets) c.PacketsSent = uint64(row.OutUcastPkts) c.PacketsRecv = uint64(row.InUcastPkts) c.Errin = uint64(row.InErrors) c.Errout = uint64(row.OutErrors) c.Dropin = uint64(row.InDiscards) c.Dropout = uint64(row.OutDiscards) ret = append(ret, c) } } if pernic == false { return getNetIOCountersAll(ret) } return ret, nil }
// If the ifindex is zero, interfaceTable returns mappings of all // network interfaces. Otheriwse it returns a mapping of a specific // interface. func interfaceTable(ifindex int) ([]Interface, os.Error) { ai, e := getAdapterList() if e != nil { return nil, e } ii, e := getInterfaceList() if e != nil { return nil, e } var ift []Interface for ; ai != nil; ai = ai.Next { index := ai.Index if ifindex == 0 || ifindex == int(index) { var flags Flags row := syscall.MibIfRow{Index: index} e := syscall.GetIfEntry(&row) if e != 0 { return nil, os.NewSyscallError("GetIfEntry", e) } for _, ii := range ii { ip := (*syscall.RawSockaddrInet4)(unsafe.Pointer(&ii.Address)).Addr ipv4 := IPv4(ip[0], ip[1], ip[2], ip[3]) ipl := &ai.IpAddressList for ipl != nil { ips := bytePtrToString(&ipl.IpAddress.String[0]) if ipv4.Equal(parseIPv4(ips)) { break } ipl = ipl.Next } if ipl == nil { continue } if ii.Flags&syscall.IFF_UP != 0 { flags |= FlagUp } if ii.Flags&syscall.IFF_LOOPBACK != 0 { flags |= FlagLoopback } if ii.Flags&syscall.IFF_BROADCAST != 0 { flags |= FlagBroadcast } if ii.Flags&syscall.IFF_POINTTOPOINT != 0 { flags |= FlagPointToPoint } if ii.Flags&syscall.IFF_MULTICAST != 0 { flags |= FlagMulticast } } name := bytePtrToString(&ai.AdapterName[0]) ifi := Interface{ Index: int(index), MTU: int(row.Mtu), Name: name, HardwareAddr: HardwareAddr(row.PhysAddr[:row.PhysAddrLen]), Flags: flags} ift = append(ift, ifi) } } return ift, nil }