route.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. /*
  2. * Copyright (C)2013-2020 ZeroTier, Inc.
  3. *
  4. * Use of this software is governed by the Business Source License included
  5. * in the LICENSE.TXT file in the project's root directory.
  6. *
  7. * Change Date: 2025-01-01
  8. *
  9. * On the date above, in accordance with the Business Source License, use
  10. * of this software will be governed by version 2.0 of the Apache License.
  11. */
  12. /****/
  13. package zerotier
  14. import (
  15. "net"
  16. "unsafe"
  17. )
  18. // Route represents a route in a host's routing table
  19. type Route struct {
  20. // Target for this route
  21. Target net.IPNet `json:"target"`
  22. // Via is how to reach this target (null/empty if the target IP range is local to this virtual LAN)
  23. Via *net.IP `json:"via,omitempty"`
  24. // Route flags (currently unused, always 0)
  25. Flags uint16 `json:"flags"`
  26. // Metric is an interface metric that can affect route priority (behavior can be OS-specific)
  27. Metric uint16 `json:"metric"`
  28. }
  29. // String returns a string representation of this route
  30. func (r *Route) String() string {
  31. if r.Via != nil {
  32. return r.Target.String() + "->LAN"
  33. }
  34. return r.Target.String() + "->" + r.Via.String()
  35. }
  36. // key generates a key suitable for a map[] from this route
  37. func (r *Route) key() (k [6]uint64) {
  38. copy(((*[16]byte)(unsafe.Pointer(&k[0])))[:], r.Target.IP)
  39. ones, bits := r.Target.Mask.Size()
  40. k[2] = (uint64(ones) << 32) | uint64(bits)
  41. if r.Via != nil {
  42. copy(((*[16]byte)(unsafe.Pointer(&k[3])))[:], *r.Via)
  43. }
  44. k[5] = (uint64(r.Flags) << 32) | uint64(r.Metric)
  45. return
  46. }