Skip to content
This repository was archived by the owner on Feb 19, 2025. It is now read-only.

Commit f5dccb5

Browse files
authored
Merge pull request #26 from kanocz/master
Add option for so_reuserport for NetFlow and sFlow
2 parents def764f + 4dbb63a commit f5dccb5

File tree

1 file changed

+59
-12
lines changed

1 file changed

+59
-12
lines changed

goflow.go

Lines changed: 59 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"encoding/json"
2727

2828
"bytes"
29+
reuseport "github.com/libp2p/go-reuseport"
2930
)
3031

3132
const AppVersion = "GoFlow v2.0.7"
@@ -34,11 +35,13 @@ var (
3435
FEnable = flag.Bool("netflow", true, "Enable NetFlow")
3536
SEnable = flag.Bool("sflow", true, "Enable sFlow")
3637

37-
FAddr = flag.String("faddr", ":", "NetFlow/IPFIX listening address")
38-
FPort = flag.Int("fport", 2055, "NetFlow/IPFIX listening port")
38+
FAddr = flag.String("faddr", ":", "NetFlow/IPFIX listening address")
39+
FPort = flag.Int("fport", 2055, "NetFlow/IPFIX listening port")
40+
FReuse = flag.Bool("freuse", false, "Use so_reuseport for NetFlow/IPFIX listening")
3941

40-
SAddr = flag.String("saddr", ":", "sFlow listening address")
41-
SPort = flag.Int("sport", 6343, "sFlow listening port")
42+
SAddr = flag.String("saddr", ":", "sFlow listening address")
43+
SPort = flag.Int("sport", 6343, "sFlow listening port")
44+
SReuse = flag.Bool("sreuse", false, "Use so_reuseport for sFlow listening")
4245

4346
FWorkers = flag.Int("fworkers", 1, "Number of NetFlow workers")
4447
SWorkers = flag.Int("sworkers", 1, "Number of sFlow workers")
@@ -440,10 +443,32 @@ func (s *state) netflowRoutine() {
440443
IP: net.ParseIP(*FAddr),
441444
Port: *FPort,
442445
}
443-
udpconn, err := net.ListenUDP("udp", &addr)
444-
if err != nil {
445-
log.Fatalf("Fatal error: could not listen to UDP (%v)", err)
446-
udpconn.Close()
446+
447+
var (
448+
udpconn *net.UDPConn
449+
err error
450+
)
451+
452+
if *FReuse {
453+
pconn, err := reuseport.ListenPacket("udp", addr.String())
454+
if err != nil {
455+
log.Fatalf("Fatal error: could not listen to UDP (%v)", err)
456+
pconn.Close()
457+
}
458+
var ok bool
459+
udpconn, ok = pconn.(*net.UDPConn)
460+
if !ok {
461+
log.Fatalf("Fatal error: could not listen to UDP with so_reuseport")
462+
pconn.Close()
463+
}
464+
465+
} else {
466+
467+
udpconn, err = net.ListenUDP("udp", &addr)
468+
if err != nil {
469+
log.Fatalf("Fatal error: could not listen to UDP (%v)", err)
470+
udpconn.Close()
471+
}
447472
}
448473

449474
payload := make([]byte, 9000)
@@ -658,10 +683,32 @@ func (s *state) sflowRoutine() {
658683
IP: net.ParseIP(*SAddr),
659684
Port: *SPort,
660685
}
661-
udpconn, err := net.ListenUDP("udp", &addr)
662-
if err != nil {
663-
log.Fatalf("Fatal error: could not listen to UDP (%v)", err)
664-
udpconn.Close()
686+
687+
var (
688+
udpconn *net.UDPConn
689+
err error
690+
)
691+
692+
if *SReuse {
693+
pconn, err := reuseport.ListenPacket("udp", addr.String())
694+
if err != nil {
695+
log.Fatalf("Fatal error: could not listen to UDP (%v)", err)
696+
pconn.Close()
697+
}
698+
var ok bool
699+
udpconn, ok = pconn.(*net.UDPConn)
700+
if !ok {
701+
log.Fatalf("Fatal error: could not listen to UDP with so_reuseport")
702+
pconn.Close()
703+
}
704+
705+
} else {
706+
707+
udpconn, err = net.ListenUDP("udp", &addr)
708+
if err != nil {
709+
log.Fatalf("Fatal error: could not listen to UDP (%v)", err)
710+
udpconn.Close()
711+
}
665712
}
666713

667714
payload := make([]byte, 9000)

0 commit comments

Comments
 (0)