diff --git a/fuzz_test.go b/fuzz_test.go index 29c0999..837ea82 100644 --- a/fuzz_test.go +++ b/fuzz_test.go @@ -60,10 +60,7 @@ func FuzzBuildParseRoundtrip(f *testing.F) { if dataPkt.Universe != universe { t.Fatalf("universe mismatch: sent %d, got %d", universe, dataPkt.Universe) } - expectedLen := len(dmxInput) - if expectedLen > 512 { - expectedLen = 512 - } + expectedLen := min(len(dmxInput), 512) if !bytes.Equal(dataPkt.Data[:expectedLen], dmxInput[:expectedLen]) { t.Fatalf("dmx data mismatch") } diff --git a/protocol.go b/protocol.go index c16b232..6192dc9 100644 --- a/protocol.go +++ b/protocol.go @@ -58,7 +58,7 @@ func MulticastAddr(universe uint16) *net.UDPAddr { } } -func ParsePacket(data []byte) (interface{}, error) { +func ParsePacket(data []byte) (any, error) { if len(data) < 22 { return nil, ErrPacketTooShort } @@ -99,10 +99,7 @@ func parseDataPacket(data []byte) (*DataPacket, error) { return nil, ErrPacketTooShort } - dmxLen := int(propCount) - 1 - if dmxLen > 512 { - dmxLen = 512 - } + dmxLen := min(int(propCount)-1, 512) if len(data) < 126+dmxLen { return nil, ErrPacketTooShort @@ -121,7 +118,7 @@ func parseDataPacket(data []byte) (*DataPacket, error) { return pkt, nil } -func parseExtendedPacket(data []byte) (interface{}, error) { +func parseExtendedPacket(data []byte) (any, error) { if len(data) < 118 { return nil, ErrPacketTooShort } @@ -149,7 +146,7 @@ func parseExtendedPacket(data []byte) (interface{}, error) { universeCount := (len(data) - 120) / 2 pkt.Universes = make([]uint16, 0, universeCount) - for i := 0; i < universeCount; i++ { + for i := range universeCount { u := binary.BigEndian.Uint16(data[120+i*2 : 122+i*2]) if u >= 1 && u <= 63999 { pkt.Universes = append(pkt.Universes, u) @@ -160,10 +157,7 @@ func parseExtendedPacket(data []byte) (interface{}, error) { } func BuildDataPacket(universe uint16, sequence uint8, sourceName string, cid [16]byte, data []byte) []byte { - dataLen := len(data) - if dataLen > 512 { - dataLen = 512 - } + dataLen := min(len(data), 512) pktLen := 126 + dataLen buf := make([]byte, pktLen) @@ -200,10 +194,7 @@ func BuildDataPacket(universe uint16, sequence uint8, sourceName string, cid [16 } func BuildDiscoveryPacket(sourceName string, cid [16]byte, page, lastPage uint8, universes []uint16) []byte { - universeCount := len(universes) - if universeCount > 512 { - universeCount = 512 - } + universeCount := min(len(universes), 512) pktLen := 120 + universeCount*2 buf := make([]byte, pktLen) diff --git a/receiver.go b/receiver.go index 9336971..aa20712 100644 --- a/receiver.go +++ b/receiver.go @@ -9,7 +9,7 @@ import ( type Receiver struct { conn *multicast.Conn - handler func(src *net.UDPAddr, pkt interface{}) + handler func(src *net.UDPAddr, pkt any) done chan struct{} } @@ -60,7 +60,7 @@ func NewDiscoveryReceiver(iface *net.Interface) (*Receiver, error) { }, nil } -func (r *Receiver) SetHandler(fn func(src *net.UDPAddr, pkt interface{})) { +func (r *Receiver) SetHandler(fn func(src *net.UDPAddr, pkt any)) { r.handler = fn } diff --git a/sender.go b/sender.go index 05488b5..5d62665 100644 --- a/sender.go +++ b/sender.go @@ -3,7 +3,7 @@ package sacn import ( "crypto/rand" "net" - "sort" + "slices" "sync" "time" @@ -128,17 +128,14 @@ func (s *Sender) sendDiscovery() { return } - sort.Slice(universes, func(i, j int) bool { return universes[i] < universes[j] }) + slices.Sort(universes) const maxPerPage = 512 totalPages := (len(universes) + maxPerPage - 1) / maxPerPage - for page := 0; page < totalPages; page++ { + for page := range totalPages { start := page * maxPerPage - end := start + maxPerPage - if end > len(universes) { - end = len(universes) - } + end := min(start+maxPerPage, len(universes)) pkt := BuildDiscoveryPacket(s.sourceName, s.cid, uint8(page), uint8(totalPages-1), universes[start:end]) s.conn.WriteToUDP(pkt, DiscoveryAddr) }