dotcloud/docker

View on GitHub
libnetwork/drivers/overlay/overlayutils/utils.go

Summary

Maintainability
A
0 mins
Test Coverage
// 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
        }
    }
}