simplify key management in address mapping

This commit is contained in:
Konstantin Demin 2024-06-06 09:19:17 +03:00
parent 426bd5a659
commit dd278b7374
Signed by: krd
GPG Key ID: 4D56F87A8BA65FD0
2 changed files with 12 additions and 8 deletions

View File

@ -8,8 +8,6 @@ import (
"net" "net"
"sync" "sync"
"time" "time"
"github.com/cespare/xxhash/v2"
) )
const ( const (
@ -92,6 +90,13 @@ func addrMapGet(srcIp net.IP, dstCidr *net.IPNet, ttl uint32) net.IP {
if err != nil { if err != nil {
log.Fatalf("rand.Read(): error %v", err) log.Fatalf("rand.Read(): error %v", err)
} }
var hkey any
switch addrlen {
case net.IPv4len:
hkey = binary.NativeEndian.Uint32(curr.SrcAddr)
case net.IPv6len:
hkey = binary.NativeEndian.Uint64(curr.SrcAddr[net.IPv6len/2:])
}
// adjust random bytes to dstCidr // adjust random bytes to dstCidr
for i := range addrlen / 4 { for i := range addrlen / 4 {
@ -101,7 +106,6 @@ func addrMapGet(srcIp net.IP, dstCidr *net.IPNet, ttl uint32) net.IP {
a += (b & ^m) a += (b & ^m)
binary.NativeEndian.PutUint32(curr.SrcAddr[i*4:], a) binary.NativeEndian.PutUint32(curr.SrcAddr[i*4:], a)
} }
hsum := xxhash.Sum64(curr.SrcAddr)
curr.Created = time.Now() curr.Created = time.Now()
@ -109,9 +113,9 @@ func addrMapGet(srcIp net.IP, dstCidr *net.IPNet, ttl uint32) net.IP {
var loaded bool var loaded bool
switch addrlen { switch addrlen {
case net.IPv4len: case net.IPv4len:
xprev, loaded = addr4.LoadOrStore(hsum, curr) xprev, loaded = addr4.LoadOrStore(hkey, curr)
case net.IPv6len: case net.IPv6len:
xprev, loaded = addr6.LoadOrStore(hsum, curr) xprev, loaded = addr6.LoadOrStore(hkey, curr)
} }
if !loaded { if !loaded {
// early return // early return
@ -135,9 +139,9 @@ func addrMapGet(srcIp net.IP, dstCidr *net.IPNet, ttl uint32) net.IP {
if prev.GetTtl() < int32(curr.Ttl) { if prev.GetTtl() < int32(curr.Ttl) {
switch addrlen { switch addrlen {
case net.IPv4len: case net.IPv4len:
addr4.Store(hsum, curr) addr4.Store(hkey, curr)
case net.IPv6len: case net.IPv6len:
addr6.Store(hsum, curr) addr6.Store(hkey, curr)
} }
} }

2
go.mod
View File

@ -3,7 +3,6 @@ module git.krd.sh/krd/powerdns-remote-http-example
go 1.22 go 1.22
require ( require (
github.com/cespare/xxhash/v2 v2.3.0
github.com/gin-gonic/gin v1.10.0 github.com/gin-gonic/gin v1.10.0
github.com/google/nftables v0.2.0 github.com/google/nftables v0.2.0
github.com/miekg/dns v1.1.59 github.com/miekg/dns v1.1.59
@ -14,6 +13,7 @@ require (
github.com/beorn7/perks v1.0.1 // indirect github.com/beorn7/perks v1.0.1 // indirect
github.com/bytedance/sonic v1.11.8 // indirect github.com/bytedance/sonic v1.11.8 // indirect
github.com/bytedance/sonic/loader v0.1.1 // indirect github.com/bytedance/sonic/loader v0.1.1 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/cloudwego/base64x v0.1.4 // indirect github.com/cloudwego/base64x v0.1.4 // indirect
github.com/cloudwego/iasm v0.2.0 // indirect github.com/cloudwego/iasm v0.2.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.4 // indirect github.com/gabriel-vasile/mimetype v1.4.4 // indirect