Files
gluetun/internal/provider/perfectprivacy/portforward.go
Quentin McGaw 3c8e80a1a4 chore(lint): upgrade linter from v1.56.2 to v1.61.0
- Remove no longer needed exclude rules
- Add new exclude rules for printf govet errors
- Remove deprecated linters `execinquery` and `exportloopref`
- Rename linter `goerr113` to `err113`
- Rename linter `gomnd` to `mnd`
2024-10-11 18:05:54 +00:00

44 lines
1.1 KiB
Go

package perfectprivacy
import (
"context"
"net/netip"
"github.com/qdm12/gluetun/internal/provider/utils"
)
// PortForward calculates and returns the VPN server side ports forwarded.
func (p *Provider) PortForward(_ context.Context,
objects utils.PortForwardObjects) (ports []uint16, err error) {
if !objects.InternalIP.IsValid() {
panic("internal ip is not set")
}
return internalIPToPorts(objects.InternalIP), nil
}
func (p *Provider) KeepPortForward(ctx context.Context,
_ utils.PortForwardObjects) (err error) {
<-ctx.Done()
return ctx.Err()
}
// See https://www.perfect-privacy.com/en/faq section
// How are the default forwarding ports being calculated?
func internalIPToPorts(internalIP netip.Addr) (ports []uint16) {
internalIPBytes := internalIP.AsSlice()
// Convert the internal IP address to a bit string
// and keep only the last 12 bits
last16Bits := internalIPBytes[len(internalIPBytes)-2:]
last12Bits := []byte{
last16Bits[0] & 0b00001111, // only keep 4 bits
last16Bits[1],
}
basePort := uint16(last12Bits[0])<<8 + uint16(last12Bits[1]) //nolint:mnd
return []uint16{
10000 + basePort,
20000 + basePort,
30000 + basePort,
}
}