@@ -18,7 +18,10 @@ import (
18
18
log "github.com/sirupsen/logrus"
19
19
)
20
20
21
- const SendBufferSize = 100
21
+ const (
22
+ SEND_BUFFER_SIZE = 100
23
+ MAX_PACKET_SIZE = 8192
24
+ )
22
25
23
26
// Struct containing everything for an interface
24
27
type Listen struct {
@@ -93,7 +96,7 @@ func newListener(netif *net.Interface, promisc bool, ports []int32, to time.Dura
93
96
timeout : to ,
94
97
promisc : promisc ,
95
98
handle : nil ,
96
- sendpkt : make (chan Send , SendBufferSize ),
99
+ sendpkt : make (chan Send , SEND_BUFFER_SIZE ),
97
100
clients : clients ,
98
101
}
99
102
log .Debugf ("Listen: %s" , spew .Sdump (new ))
@@ -419,9 +422,8 @@ func isValidLayerType(layertype layers.LinkType) bool {
419
422
return false
420
423
}
421
424
422
- const MAX_PACKET_SIZE = 8192
423
-
424
425
// SinkUdpPackets opens a UDP socket for broadcast packets and sends them to /dev/null
426
+ // creates a go-routine for each interface/port combo so we don't block
425
427
func (l * Listen ) SinkUdpPackets () error {
426
428
addrs , err := l .netif .Addrs ()
427
429
if err != nil {
@@ -431,6 +433,7 @@ func (l *Listen) SinkUdpPackets() error {
431
433
for _ , addr := range addrs {
432
434
addrs := addr .String ()
433
435
436
+ // skip anything that doesn't look like a unicast IPv4 address
434
437
if addrs == "0.0.0.0" || addrs == "" || strings .Contains (addrs , ":" ) {
435
438
continue
436
439
}
@@ -449,9 +452,10 @@ func (l *Listen) SinkUdpPackets() error {
449
452
if err := conn .SetReadBuffer (MAX_PACKET_SIZE ); err != nil {
450
453
return err
451
454
}
455
+
452
456
go func () {
457
+ buff := make ([]byte , MAX_PACKET_SIZE )
453
458
for {
454
- buff := make ([]byte , MAX_PACKET_SIZE )
455
459
_ , _ , err := conn .ReadFromUDP (buff )
456
460
if err != nil {
457
461
log .WithError (err ).Warnf ("Unable to read broadcast packet" )
0 commit comments