From aaf43bc8886c4a10d11d1931a57697a946f63d0a Mon Sep 17 00:00:00 2001 From: Sebastian Dahlgren Date: Tue, 18 Jul 2017 14:54:10 +0200 Subject: [PATCH] first commit --- ifread/ewma.go | 87 ++++++++++++++++++++++++++++++++++++++++++++ ifread/readvals.go | 44 ++++++++++++++++++++++ main.go | 7 ++++ squeezer/commands.go | 25 +++++++++++++ 4 files changed, 163 insertions(+) create mode 100644 ifread/ewma.go create mode 100644 ifread/readvals.go create mode 100644 main.go create mode 100644 squeezer/commands.go diff --git a/ifread/ewma.go b/ifread/ewma.go new file mode 100644 index 0000000..3b0fb6d --- /dev/null +++ b/ifread/ewma.go @@ -0,0 +1,87 @@ +package ifread + +import ( + "errors" + "fmt" + "io/ioutil" + "os" + + "github.com/VividCortex/ewma" +) + +type NicIO struct { + name string + rates ifaceRates + ewma ifaceEWMA + sync.RWMutex +} +type ifaceRates struct { + rxb, txb, rxp, txp func(uint64) uint64 +} + +type ifaceEWMA struct { + rxb, txb, rxp, txp ewma.MovingAverage +} + +// Delta is a small closure over the counters, returning the delta against previous +// first = initial value +func Delta(first uint64) func(uint64) uint64 { + keep := first + return func(delta uint64) uint64 { + v := delta - keep + keep = delta + return v + } +} + +// MakeNic initalises the NicIO type +// It'll be used in a receiver go channel +func MakeNic(name string) (*NicIO, error) { + var nic NicIO + nic.name = name + r, err := readvals(name) + if err != nil { + return nil, err + } + nic.Lock() + defer nic.Unlock() + nic.rates.rxb = Delta(r.rxb) + nic.rates.txb = Delta(r.txb) + nic.rates.rxp = Delta(r.rxp) + nic.rates.txp = Delta(r.txp) + nic.ewma.rxb = ewma.NewMovingAverage() + nic.ewma.txb = ewma.NewMovingAverage() + nic.ewma.rxp = ewma.NewMovingAverage() + nic.ewma.txp = ewma.NewMovingAverage() + return &nic, nil +} + +// ReadNic put all NIC data in struct +func (nic *NicIO) ReadNic() error { + ifstat, err := readvals(nic.name) + // fmt.Println("%+v", ifstat) + if err == nil { + // mind that calling nic.rate.xxx updates rate + nic.ewma.rxb.Add(float64(nic.rates.rxb(ifstat.rxb))) + nic.ewma.txb.Add(float64(nic.rates.txb(ifstat.txb))) + nic.ewma.rxp.Add(float64(nic.rates.rxp(ifstat.rxp))) + nic.ewma.txp.Add(float64(nic.rates.txp(ifstat.txp))) + return nil + } + return err +} + +// ListNics retuns the list of nics +// TODO: make it regexp aware +func ListNics() []string { + var ifaces []string + l, err := ioutil.ReadDir("/sys/class/net") + if err != nil { + errors.New("Can't read /sys/class/net. Is /sys mounted? Bailing...") + os.Exit(1) + } + for _, iface := range l { + ifaces = append(ifaces, iface.Name()) + } + return ifaces +} diff --git a/ifread/readvals.go b/ifread/readvals.go new file mode 100644 index 0000000..ad0d0e7 --- /dev/null +++ b/ifread/readvals.go @@ -0,0 +1,44 @@ +package ifread + +import ( + "io/ioutil" + "strconv" + "strings" +) + +type IfStat struct { + rxb, txb, rxp, txp uint64 +} + +func readval(path string) (uint64, error) { + contents, err := ioutil.ReadFile(path) + if err != nil { + return 0, err + } + // we assume that's always ok ? + val := strings.Split(string(contents), "\n") + digit, _ := strconv.ParseUint(val[0], 10, 64) + return digit, nil +} + +func readvals(i string) (IfStat, error) { + v := IfStat{} + var err error + // repeat .. fsck it only 4 + if v.rxb, err = readval("/sys/class/net/" + i + "/statistics/rx_bytes"); err != nil { + errfound = true + } + if v.txb, err = readval("/sys/class/net/" + i + "/statistics/tx_bytes"); err != nil { + errfound = true + } + if v.rxp, err = readval("/sys/class/net/" + i + "/statistics/rx_packets"); err != nil { + errfound = true + } + if v.txp, err = readval("/sys/class/net/" + i + "/statistics/tx_packets"); err != nil { + errfound = true + } + if errfound { + return nil, err + } + return v, nil +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..50e8d8d --- /dev/null +++ b/main.go @@ -0,0 +1,7 @@ +package main + +import "fmt" + +func main() { + fmt.Println("vim-go") +} diff --git a/squeezer/commands.go b/squeezer/commands.go new file mode 100644 index 0000000..c414e5b --- /dev/null +++ b/squeezer/commands.go @@ -0,0 +1,25 @@ +package squeezer + +import "github.com/delandtj/netork/ifread" + +func main() { + fmt.Println("vim-go") +} + +const ( + _ = iota + 1000mbit + 500mbit + 200mbit + 100mbit + 50mbit + 20mbit + 5mbit + 1mbit + 200kbit + 20kbit +) + +func SqueezeBW(name string, bw int) error { + +}