From 03ee8a4d3227312a1dad39f644993d9f75bbb42f Mon Sep 17 00:00:00 2001 From: Murilo Santana Date: Thu, 22 Mar 2018 01:03:20 -0300 Subject: [PATCH 1/2] fix race condition in packets.Stats --- modules/net_probe_udp.go | 4 +--- packets/queue.go | 37 ++++++++++++++++++++++--------------- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/modules/net_probe_udp.go b/modules/net_probe_udp.go index 14e299a9..20e2541e 100644 --- a/modules/net_probe_udp.go +++ b/modules/net_probe_udp.go @@ -19,9 +19,7 @@ func (p *Prober) sendProbeUDP(from net.IP, from_hw net.HardwareAddr, ip net.IP) wrote, _ := con.Write([]byte{0x00}) if wrote > 0 { - p.Session.Queue.Stats.Lock() - p.Session.Queue.Stats.Sent += uint64(wrote) - p.Session.Queue.Stats.Unlock() + p.Session.Queue.Stats.UpdateSent(uint64(wrote)) } } } diff --git a/packets/queue.go b/packets/queue.go index 5d49d4ab..97e4fb32 100644 --- a/packets/queue.go +++ b/packets/queue.go @@ -33,6 +33,25 @@ type Stats struct { Errors uint64 } +func (s Stats) incrementErrors() { + s.Lock() + s.Errors++ + s.Unlock() +} + +func (s Stats) UpdateSent(raw uint64) { + s.Lock() + s.Sent += raw + s.Unlock() +} + +func (s Stats) updateReceived(pktSize uint64) { + s.Lock() + s.PktReceived++ + s.Received += pktSize + s.Unlock() +} + type PacketCallback func(pkt gopacket.Packet) type Queue struct { @@ -148,16 +167,8 @@ func (q *Queue) worker() { } q.trackProtocols(pkt) - pktSize := uint64(len(pkt.Data())) - - q.Stats.Lock() - - q.Stats.PktReceived++ - q.Stats.Received += pktSize - - q.Stats.Unlock() - + q.Stats.UpdateReceived(pktSize) q.onPacketCallback(pkt) // decode eth and ipv4 layers @@ -200,14 +211,10 @@ func (q *Queue) Send(raw []byte) error { defer q.writes.Done() if err := q.handle.WritePacketData(raw); err != nil { - q.Stats.Lock() - q.Stats.Errors++ - q.Stats.Unlock() + q.Stats.incrementErrors() return err } else { - q.Stats.Lock() - q.Stats.Sent += uint64(len(raw)) - q.Stats.Unlock() + q.Stats.UpdateSent(uint64(len(raw))) } return nil From d53b87810cefc4a4282912f948a8f12da0271580 Mon Sep 17 00:00:00 2001 From: Murilo Santana Date: Thu, 22 Mar 2018 02:00:30 -0300 Subject: [PATCH 2/2] typo --- packets/queue.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packets/queue.go b/packets/queue.go index 97e4fb32..6c4f4e4b 100644 --- a/packets/queue.go +++ b/packets/queue.go @@ -168,7 +168,7 @@ func (q *Queue) worker() { q.trackProtocols(pkt) pktSize := uint64(len(pkt.Data())) - q.Stats.UpdateReceived(pktSize) + q.Stats.updateReceived(pktSize) q.onPacketCallback(pkt) // decode eth and ipv4 layers