Metric.h 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. /* vim: set expandtab ts=4 sw=4: */
  2. /*
  3. * You may redistribute this program and/or modify it under the terms of
  4. * the GNU General Public License as published by the Free Software Foundation,
  5. * either version 3 of the License, or (at your option) any later version.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. *
  12. * You should have received a copy of the GNU General Public License
  13. * along with this program. If not, see <https://www.gnu.org/licenses/>.
  14. */
  15. #ifndef Metric_H
  16. #define Metric_H
  17. #include <stdint.h>
  18. // This is INTERNAL to cjdns, it does not get used in the protocol at all,
  19. // but it is an internal protocol which is used to coordinate the different
  20. // modules.
  21. //
  22. // Different parts of the code become aware of the validity of different paths.
  23. // The InterfaceController becomes aware of peers, the DHT and the subnode
  24. // Pathfinder become aware of more distant nodes. And of course the SessionManager
  25. // becomes aware of a node by virtue of communicating with it.
  26. //
  27. // Each of these components informs the SessionManager when it becomes aware
  28. // of a path, if the SessionManager has a session for the node and the metric
  29. // for the path is lower than the metric which the SessionManager currently
  30. // has, it will update the path to that node.
  31. //
  32. // Because this is not inter-node protocol, you can change these numbers at any
  33. // time.
  34. // The snode says this is a path to the node
  35. static const uint32_t Metric_SNODE_SAYS = 0xff100000;
  36. // Node is a direct peer according to the SubnodePathfinder
  37. static const uint32_t Metric_PF_PEER = 0xff200000;
  38. // This is our discovered path to our snode
  39. static const uint32_t Metric_SNODE = 0xff300000;
  40. // Node is a direct peer according to the (dht) Pathfinder
  41. static const uint32_t Metric_DHT_PEER = 0xff400000;
  42. // We sent a ping to a node to complete the session setup, it replied.
  43. // This is a path which we know works, but we don't know if it's any good.
  44. static const uint32_t Metric_PING_REPLY = 0xff500000;
  45. static const uint32_t Metric_DHT_INCOMING = 0xff510000;
  46. // Anything that comes from the DHT Pathfinder is &'d with Metric_DHT_MASK
  47. // and OR'd with Metric_DHT.
  48. static const uint32_t Metric_DHT = 0xff600000;
  49. static const uint32_t Metric_DHT_MASK = 0x000fffff;
  50. // Incoming message, CryptoAuth has not yet checked that the key is real
  51. static const uint32_t Metric_SM_INCOMING = 0xff700000;
  52. // Outgoing message, some upper layer thinks this is the path
  53. static const uint32_t Metric_SM_SEND = 0xff710000;
  54. // We have no information about this path, but we don't know it to be dead
  55. static const uint32_t Metric_NO_INFO = 0xfffffffe;
  56. // This will cause the SM to kill off a path
  57. static const uint32_t Metric_DEAD_LINK = 0xffffffff;
  58. // This is known to be a peer by InterfaceController, OR'd with the latency
  59. // This is NEVER used as a metric in the SessionManager, it is only how
  60. // the InterfaceController reports a peer to the pathfinders.
  61. static const uint32_t Metric_IC_PEER = 0xffff0000;
  62. static const uint32_t Metric_IC_PEER_MASK = 0x0000ffff;
  63. #endif