mirror of
https://github.com/moby/moby.git
synced 2026-07-24 16:26:51 +00:00
Parse in O(1) memory by using strings.Cut to split the string iteratively. Signed-off-by: Cory Snider <csnider@mirantis.com>
65 lines
1.6 KiB
Go
65 lines
1.6 KiB
Go
// Package overlayutils provides utility functions for overlay networks
|
|
package overlayutils
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
"sync"
|
|
)
|
|
|
|
var (
|
|
mutex sync.RWMutex
|
|
vxlanUDPPort = defaultVXLANUDPPort
|
|
)
|
|
|
|
const defaultVXLANUDPPort uint32 = 4789
|
|
|
|
// ConfigVXLANUDPPort configures the VXLAN UDP port (data path port) number.
|
|
// If no port is set, the default (4789) is returned. Valid port numbers are
|
|
// between 1024 and 49151.
|
|
func ConfigVXLANUDPPort(vxlanPort uint32) error {
|
|
if vxlanPort == 0 {
|
|
vxlanPort = defaultVXLANUDPPort
|
|
}
|
|
// IANA procedures for each range in detail
|
|
// The Well Known Ports, aka the System Ports, from 0-1023
|
|
// The Registered Ports, aka the User Ports, from 1024-49151
|
|
// The Dynamic Ports, aka the Private Ports, from 49152-65535
|
|
// So we can allow range between 1024 to 49151
|
|
if vxlanPort < 1024 || vxlanPort > 49151 {
|
|
return fmt.Errorf("VXLAN UDP port number is not in valid range (1024-49151): %d", vxlanPort)
|
|
}
|
|
mutex.Lock()
|
|
vxlanUDPPort = vxlanPort
|
|
mutex.Unlock()
|
|
return nil
|
|
}
|
|
|
|
// VXLANUDPPort returns Vxlan UDP port number
|
|
func VXLANUDPPort() uint32 {
|
|
mutex.RLock()
|
|
defer mutex.RUnlock()
|
|
return vxlanUDPPort
|
|
}
|
|
|
|
// AppendVNIList appends the VNI values encoded as a CSV string to slice.
|
|
func AppendVNIList(vnis []uint32, csv string) ([]uint32, error) {
|
|
for {
|
|
var (
|
|
vniStr string
|
|
found bool
|
|
)
|
|
vniStr, csv, found = strings.Cut(csv, ",")
|
|
vni, err := strconv.Atoi(vniStr)
|
|
if err != nil {
|
|
return vnis, fmt.Errorf("invalid vxlan id value %q passed", vniStr)
|
|
}
|
|
|
|
vnis = append(vnis, uint32(vni))
|
|
if !found {
|
|
return vnis, nil
|
|
}
|
|
}
|
|
}
|