2019-09-20 16:09:05 +00:00
|
|
|
/*
|
|
|
|
* Copyright (c)2019 ZeroTier, Inc.
|
|
|
|
*
|
|
|
|
* Use of this software is governed by the Business Source License included
|
|
|
|
* in the LICENSE.TXT file in the project's root directory.
|
|
|
|
*
|
|
|
|
* Change Date: 2023-01-01
|
|
|
|
*
|
|
|
|
* On the date above, in accordance with the Business Source License, use
|
|
|
|
* of this software will be governed by version 2.0 of the Apache License.
|
|
|
|
*/
|
|
|
|
/****/
|
|
|
|
|
2019-09-21 01:48:48 +00:00
|
|
|
package zerotier
|
2019-09-20 16:09:05 +00:00
|
|
|
|
2019-09-22 03:40:06 +00:00
|
|
|
import (
|
|
|
|
"net"
|
|
|
|
"unsafe"
|
|
|
|
)
|
2019-09-20 16:09:05 +00:00
|
|
|
|
2019-09-21 01:48:48 +00:00
|
|
|
// Route represents a route in a host's routing table
|
|
|
|
type Route struct {
|
|
|
|
// Target for this route
|
|
|
|
Target net.IPNet
|
|
|
|
|
|
|
|
// Via is how to reach this target (null/empty if the target IP range is local to this virtual LAN)
|
|
|
|
Via net.IP
|
|
|
|
|
2019-09-22 01:22:25 +00:00
|
|
|
// Route flags (currently unused, always 0)
|
|
|
|
Flags uint16
|
|
|
|
|
2019-09-21 01:48:48 +00:00
|
|
|
// Metric is an interface metric that can affect route priority (behavior can be OS-specific)
|
2019-09-22 01:22:25 +00:00
|
|
|
Metric uint16
|
2019-09-21 01:48:48 +00:00
|
|
|
}
|
2019-09-22 03:40:06 +00:00
|
|
|
|
|
|
|
// key generates a key suitable for a map[] from this route
|
|
|
|
func (r *Route) key() (k [6]uint64) {
|
|
|
|
copy(((*[16]byte)(unsafe.Pointer(&k[0])))[:], r.Target.IP)
|
|
|
|
ones, bits := r.Target.Mask.Size()
|
|
|
|
k[2] = (uint64(ones) << 32) | uint64(bits)
|
|
|
|
copy(((*[16]byte)(unsafe.Pointer(&k[3])))[:], r.Via)
|
|
|
|
k[5] = (uint64(r.Flags) << 32) | uint64(r.Metric)
|
|
|
|
return
|
|
|
|
}
|