Skip to content

Commit

Permalink
Prevent heap allocations in FiveTuple Fingerprint
Browse files Browse the repository at this point in the history
  • Loading branch information
paulwe committed Apr 19, 2024
1 parent cf40c33 commit 7079c37
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 5 deletions.
4 changes: 2 additions & 2 deletions internal/allocation/allocation_manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ type Manager struct {
lock sync.RWMutex
log logging.LeveledLogger

allocations map[string]*Allocation
allocations map[FiveTupleFingerprint]*Allocation
reservations []*reservation

allocatePacketConn func(network string, requestedPort int) (net.PacketConn, net.Addr, error)
Expand All @@ -51,7 +51,7 @@ func NewManager(config ManagerConfig) (*Manager, error) {

return &Manager{
log: config.LeveledLogger,
allocations: make(map[string]*Allocation, 64),
allocations: make(map[FiveTupleFingerprint]*Allocation, 64),
allocatePacketConn: config.AllocatePacketConn,
allocateConn: config.AllocateConn,
permissionHandler: config.PermissionHandler,
Expand Down
29 changes: 26 additions & 3 deletions internal/allocation/five_tuple.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
package allocation

import (
"fmt"
"net"
)

Expand Down Expand Up @@ -33,7 +32,31 @@ func (f *FiveTuple) Equal(b *FiveTuple) bool {
return f.Fingerprint() == b.Fingerprint()
}

// FiveTupleFingerprint is a comparable representation of a FiveTuple
type FiveTupleFingerprint struct {
srcIP, dstIP [16]byte
srcPort, dstPort uint16
protocol Protocol
}

// Fingerprint is the identity of a FiveTuple
func (f *FiveTuple) Fingerprint() string {
return fmt.Sprintf("%d_%s_%s", f.Protocol, f.SrcAddr.String(), f.DstAddr.String())
func (f *FiveTuple) Fingerprint() (fp FiveTupleFingerprint) {
switch f.Protocol {
case UDP:
src := f.SrcAddr.(*net.UDPAddr)

Check failure on line 46 in internal/allocation/five_tuple.go

View workflow job for this annotation

GitHub Actions / lint / Go

type assertion must be checked (forcetypeassert)
copy(fp.srcIP[:], src.IP)
fp.srcPort = uint16(src.Port)
dst := f.SrcAddr.(*net.UDPAddr)

Check failure on line 49 in internal/allocation/five_tuple.go

View workflow job for this annotation

GitHub Actions / lint / Go

type assertion must be checked (forcetypeassert)
copy(fp.dstIP[:], dst.IP)
fp.dstPort = uint16(dst.Port)
case TCP:
src := f.SrcAddr.(*net.TCPAddr)

Check failure on line 53 in internal/allocation/five_tuple.go

View workflow job for this annotation

GitHub Actions / lint / Go

type assertion must be checked (forcetypeassert)
copy(fp.srcIP[:], src.IP)
fp.srcPort = uint16(src.Port)
dst := f.SrcAddr.(*net.TCPAddr)
copy(fp.dstIP[:], dst.IP)
fp.dstPort = uint16(dst.Port)
}
fp.protocol = f.Protocol
return
}

0 comments on commit 7079c37

Please sign in to comment.