Documentation ¶
Overview ¶
Package allocators provides the interface and the algorithm(s) for allocation of ipv6 prefixes of various sizes within a larger prefix. There are many many parallels with memory allocation.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ErrNoAddrAvail = errors.New("no address available to allocate")
ErrNoAddrAvail is returned when we can't allocate an IP because there's no unallocated space left
var ErrOverflow = errors.New("Operation overflows")
ErrOverflow is returned when arithmetic operations on IPs carry bits over/under the 0th or 128th bit respectively
Functions ¶
func AddPrefixes ¶
AddPrefixes returns the `n`th /`unit` subnet after the `ip` base subnet. It is the converse operation of Offset(), used to retrieve a prefix from the index within the allocator table
Example ¶
fmt.Println(AddPrefixes(net.ParseIP("2001:db8::"), 0xff, 64)) fmt.Println(AddPrefixes(net.ParseIP("2001:db8::"), 0x1, 128)) fmt.Println(AddPrefixes(net.ParseIP("2001:db8::"), 0xff, 32)) fmt.Println(AddPrefixes(net.ParseIP("2001:db8::"), 0x1, 16)) fmt.Println(AddPrefixes(net.ParseIP("2001:db8::"), 0xff, 65)) // Error cases fmt.Println(AddPrefixes(net.ParseIP("2001:db8::"), 0xff, 8)) fmt.Println(AddPrefixes(net.IP{10, 0, 0, 1}, 64, 32))
Output: 2001:db8:0:ff:: <nil> 2001:db8::1 <nil> 2001:eb7:: <nil> 2002:db8:: <nil> 2001:db8:0:7f:8000:: <nil> <nil> Operation overflows <nil> AddPrefixes needs 128-bit IPs
func Offset ¶
Offset returns the absolute distance between addresses `a` and `b` in units of /`prefixLength` subnets. Both addresses will have a /`prefixLength` mask applied to them, any differences of less than that will be discarded If the distance is larger than 2^64 units of /`prefixLength` an error is returned
This function is used in allocators to index bitmaps by an offset from the first ip of the range
Example ¶
fmt.Println(Offset(net.ParseIP("2001:db8:0:aabb::"), net.ParseIP("2001:db8:ff::34"), 0)) fmt.Println(Offset(net.ParseIP("2001:db8:0:aabb::"), net.ParseIP("2001:db8:ff::34"), 16)) fmt.Println(Offset(net.ParseIP("2001:db8:0:aabb::"), net.ParseIP("2001:db8:ff::34"), 32)) fmt.Println(Offset(net.ParseIP("2001:db8:0:aabb::"), net.ParseIP("2001:db8:ff::34"), 48)) fmt.Println(Offset(net.ParseIP("2001:db8:0:aabb::"), net.ParseIP("2001:db8:ff::34"), 64)) fmt.Println(Offset(net.ParseIP("2001:db8:0:aabb::"), net.ParseIP("2001:db8:ff::34"), 73)) fmt.Println(Offset(net.ParseIP("2001:db8:0:aabb::"), net.ParseIP("2001:db8:ff::34"), 80)) fmt.Println(Offset(net.ParseIP("2001:db8:0:aabb::"), net.ParseIP("2001:db8:ff::34"), 96)) fmt.Println(Offset(net.ParseIP("2001:db8:0:aabb::"), net.ParseIP("2001:db8:ff::34"), 112)) fmt.Println(Offset(net.ParseIP("2001:db8:0:aabb::"), net.ParseIP("2001:db8:ff::34"), 128))
Output: 0 <nil> 0 <nil> 0 <nil> 254 <nil> 16667973 <nil> 8534002176 <nil> 1092352278528 <nil> 71588398925611008 <nil> 0 Operation overflows 0 Operation overflows
Types ¶
type Allocator ¶
type Allocator interface { // Allocate finds a suitable prefix of the given size and returns it. // // hint is a prefix, which the client desires especially, and that the // allocator MAY try to return; the allocator SHOULD try to return a prefix of // the same size as the given hint prefix. The allocator MUST NOT return an // error if a prefix was successfully assigned, even if the prefix has nothing // in common with the hinted prefix Allocate(hint net.IPNet) (net.IPNet, error) // Free returns the prefix containing the given network to the pool // // Free may return a DoubleFreeError if the prefix being returned was not // previously allocated Free(net.IPNet) error }
Allocator is the interface to the address allocator. It only finds and allocates blocks and is not concerned with lease-specific questions like expiration (ie garbage collection needs to be handled separately)
type ErrDoubleFree ¶
ErrDoubleFree is an error type returned by Allocator.Free() when a non-allocated block is passed
func (*ErrDoubleFree) Error ¶
func (err *ErrDoubleFree) Error() string
String returns a human-readable error message for a DoubleFree error