1 #ifndef TINC_NODE_H 2 #define TINC_NODE_H 3 4 /* 5 node.h -- header for node.c 6 Copyright (C) 2001-2013 Guus Sliepen <guus@tinc-vpn.org>, 7 2001-2005 Ivo Timmermans 8 9 This program is free software; you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation; either version 2 of the License, or 12 (at your option) any later version. 13 14 This program is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 You should have received a copy of the GNU General Public License along 20 with this program; if not, write to the Free Software Foundation, Inc., 21 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 22 */ 23 24 #include "splay_tree.h" 25 #include "cipher.h" 26 #include "connection.h" 27 #include "digest.h" 28 #include "event.h" 29 #include "subnet.h" 30 31 typedef struct node_status_t { 32 unsigned int unused_active: 1; /* 1 if active (not used for nodes) */ 33 unsigned int validkey: 1; /* 1 if we currently have a valid key for him */ 34 unsigned int waitingforkey: 1; /* 1 if we already sent out a request */ 35 unsigned int visited: 1; /* 1 if this node has been visited by one of the graph algorithms */ 36 unsigned int reachable: 1; /* 1 if this node is reachable in the graph */ 37 unsigned int indirect: 1; /* 1 if this node is not directly reachable by us */ 38 unsigned int sptps: 1; /* 1 if this node supports SPTPS */ 39 unsigned int udp_confirmed: 1; /* 1 if the address is one that we received UDP traffic on */ 40 unsigned int send_locally: 1; /* 1 if the next UDP packet should be sent on the local network */ 41 unsigned int udppacket: 1; /* 1 if the most recently received packet was UDP */ 42 unsigned int validkey_in: 1; /* 1 if we have sent a valid key to him */ 43 unsigned int has_address: 1; /* 1 if we know an external address for this node */ 44 unsigned int ping_sent: 1; /* 1 if we sent a UDP probe but haven't received the reply yet */ 45 unsigned int unused: 19; 46 } node_status_t; 47 48 typedef struct node_t { 49 char *name; /* name of this node */ 50 char *hostname; /* the hostname of its real ip */ 51 node_id_t id; /* unique node ID (name hash) */ 52 uint32_t options; /* options turned on for this node */ 53 54 int sock; /* Socket to use for outgoing UDP packets */ 55 sockaddr_t address; /* his real (internet) ip to send UDP packets to */ 56 57 node_status_t status; 58 time_t last_state_change; 59 time_t last_req_key; 60 61 ecdsa_t *ecdsa; /* His public ECDSA key */ 62 sptps_t sptps; 63 64 #ifndef DISABLE_LEGACY 65 cipher_t *incipher; /* Cipher for UDP packets */ 66 digest_t *indigest; /* Digest for UDP packets */ 67 68 cipher_t *outcipher; /* Cipher for UDP packets */ 69 digest_t *outdigest; /* Digest for UDP packets */ 70 #endif 71 72 int incompression; /* Compressionlevel, 0 = no compression */ 73 int outcompression; /* Compressionlevel, 0 = no compression */ 74 75 int distance; 76 struct node_t *nexthop; /* nearest node from us to him */ 77 struct edge_t *prevedge; /* nearest node from him to us */ 78 struct node_t *via; /* next hop for UDP packets */ 79 80 splay_tree_t *subnet_tree; /* Pointer to a tree of subnets belonging to this node */ 81 82 splay_tree_t *edge_tree; /* Edges with this node as one of the endpoints */ 83 84 struct connection_t *connection; /* Connection associated with this node (if a direct connection exists) */ 85 86 uint32_t sent_seqno; /* Sequence number last sent to this node */ 87 uint32_t received_seqno; /* Sequence number last received from this node */ 88 uint32_t received; /* Total valid packets received from this node */ 89 uint32_t prev_received_seqno; 90 uint32_t prev_received; 91 uint32_t farfuture; /* Packets in a row that have arrived from the far future */ 92 unsigned char *late; /* Bitfield marking late packets */ 93 94 struct timeval udp_reply_sent; /* Last time a (gratuitous) UDP probe reply was sent */ 95 struct timeval udp_ping_sent; /* Last time a UDP probe was sent */ 96 int udp_ping_rtt; /* Round trip time of UDP ping (in microseconds; or -1 if !status.udp_confirmed) */ 97 timeout_t udp_ping_timeout; /* Ping timeout event */ 98 99 struct timeval mtu_ping_sent; /* Last time a MTU probe was sent */ 100 101 struct timeval mtu_info_sent; /* Last time a MTU_INFO message was sent */ 102 struct timeval udp_info_sent; /* Last time a UDP_INFO message was sent */ 103 104 length_t maxrecentlen; /* Maximum size of recently received packets */ 105 106 length_t mtu; /* Maximum size of packets to send to this node */ 107 length_t minmtu; /* Probed minimum MTU */ 108 length_t maxmtu; /* Probed maximum MTU */ 109 int mtuprobes; /* Number of probes */ 110 111 uint64_t in_packets; 112 uint64_t in_bytes; 113 uint64_t out_packets; 114 uint64_t out_bytes; 115 116 struct address_cache_t *address_cache; 117 } node_t; 118 119 extern struct node_t *myself; 120 extern splay_tree_t *node_tree; 121 122 extern void init_nodes(void); 123 extern void exit_nodes(void); 124 extern node_t *new_node(void) __attribute__((__malloc__)); 125 extern void free_node(node_t *n); 126 extern void node_add(node_t *n); 127 extern void node_del(node_t *n); 128 extern node_t *lookup_node(char *name); 129 extern node_t *lookup_node_id(const node_id_t *id); 130 extern node_t *lookup_node_udp(const sockaddr_t *sa); 131 extern bool dump_nodes(struct connection_t *c); 132 extern bool dump_traffic(struct connection_t *c); 133 extern void update_node_udp(node_t *n, const sockaddr_t *sa); 134 135 #endif 136