55 lines
1.4 KiB
Go
Raw Normal View History

2019-09-20 09:09:05 -07: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-20 18:48:48 -07:00
package zerotier
2019-09-20 09:09:05 -07:00
2019-09-21 20:40:06 -07:00
import (
"net"
"unsafe"
)
2019-09-20 09:09:05 -07:00
2019-09-20 18:48:48 -07:00
// Route represents a route in a host's routing table
type Route struct {
// Target for this route
2019-10-02 09:34:44 -07:00
Target net.IPNet `json:"target"`
2019-09-20 18:48:48 -07:00
// Via is how to reach this target (null/empty if the target IP range is local to this virtual LAN)
2019-10-02 09:34:44 -07:00
Via *net.IP `json:"via,omitempty"`
2019-09-20 18:48:48 -07:00
2019-09-21 18:22:25 -07:00
// Route flags (currently unused, always 0)
2019-10-02 09:34:44 -07:00
Flags uint16 `json:"flags"`
2019-09-21 18:22:25 -07:00
2019-09-20 18:48:48 -07:00
// Metric is an interface metric that can affect route priority (behavior can be OS-specific)
2019-10-02 09:34:44 -07:00
Metric uint16 `json:"metric"`
2019-09-20 18:48:48 -07:00
}
2019-09-21 20:40:06 -07:00
2019-09-25 14:16:55 -07:00
// String returns a string representation of this route
func (r *Route) String() string {
2019-10-02 07:09:54 -07:00
if r.Via != nil {
2019-09-25 14:16:55 -07:00
return r.Target.String() + "->LAN"
}
return r.Target.String() + "->" + r.Via.String()
}
2019-09-21 20:40:06 -07: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)
2019-10-02 09:34:44 -07:00
if r.Via != nil {
copy(((*[16]byte)(unsafe.Pointer(&k[3])))[:], *r.Via)
}
2019-09-21 20:40:06 -07:00
k[5] = (uint64(r.Flags) << 32) | uint64(r.Metric)
return
}