@@ -26,6 +26,7 @@ import (
2626 "encoding/json"
2727
2828 "bytes"
29+ reuseport "github.com/libp2p/go-reuseport"
2930)
3031
3132const 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