2000-03-26 00:33:07 +00:00
|
|
|
/*
|
|
|
|
net.h -- header for net.c
|
2009-09-24 21:42:30 +00:00
|
|
|
Copyright (C) 1998-2005 Ivo Timmermans
|
2014-02-07 19:38:48 +00:00
|
|
|
2000-2014 Guus Sliepen <guus@tinc-vpn.org>
|
2000-03-26 00:33:07 +00:00
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
2009-09-24 22:01:00 +00:00
|
|
|
You should have received a copy of the GNU General Public License along
|
|
|
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
2000-03-26 00:33:07 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __TINC_NET_H__
|
|
|
|
#define __TINC_NET_H__
|
|
|
|
|
2003-07-18 12:16:24 +00:00
|
|
|
#include "ipv6.h"
|
2008-12-14 12:47:26 +00:00
|
|
|
#include "cipher.h"
|
|
|
|
#include "digest.h"
|
2012-11-29 11:28:23 +00:00
|
|
|
#include "event.h"
|
2003-07-18 12:16:24 +00:00
|
|
|
|
2002-03-22 11:43:48 +00:00
|
|
|
#ifdef ENABLE_JUMBOGRAMS
|
2012-10-10 15:17:49 +00:00
|
|
|
#define MTU 9018 /* 9000 bytes payload + 14 bytes ethernet header + 4 bytes VLAN tag */
|
2002-03-22 11:43:48 +00:00
|
|
|
#else
|
2012-10-10 15:17:49 +00:00
|
|
|
#define MTU 1518 /* 1500 bytes payload + 14 bytes ethernet header + 4 bytes VLAN tag */
|
2002-03-22 11:43:48 +00:00
|
|
|
#endif
|
2000-03-26 00:33:07 +00:00
|
|
|
|
Add UDP datagram relay support to SPTPS.
This commit changes the layout of UDP datagrams to include a 6-byte
destination node ID at the very beginning of the datagram (i.e. before
the source node ID and the seqno). Note that this only applies to SPTPS.
Thanks to this new field, it is now possible to send SPTPS datagrams to
nodes that are not the final recipient of the packets, thereby using
these nodes as relay nodes. Previously SPTPS was unable to relay packets
using UDP, and required a fallback to TCP if the final recipient could
not be contacted directly using UDP. In that sense it fixes a regression
that SPTPS introduced with regard to the legacy protocol.
This change also updates tinc's low-level routing logic (i.e.
send_sptps_data()) to automatically use this relaying facility if at all
possible. Specifically, it will relay packets if we don't have a
confirmed UDP link to the final recipient (but we have one with the next
hop node), or if IndirectData is specified. This is similar to how the
legacy protocol forwards packets.
When sending packets directly without any relaying, the sender node uses
a special value for the destination node ID: instead of setting the
field to the ID of the recipient node, it writes a zero ID instead. This
allows the recipient node to distinguish between a relayed packet and a
direct packet, which is important when determining the UDP address of
the sending node.
On the relay side, relay nodes will happily relay packets that have a
destination ID which is non-zero *and* is different from their own,
provided that the source IP address of the packet is known. This is to
prevent abuse by random strangers, since a node can't authenticate the
packets that are being relayed through it.
This change keeps the protocol number from the previous datagram format
change (source IDs), 17.4. Compatibility is still preserved with 1.0 and
with pre-1.1 releases. Note, however, that nodes running this code won't
understand datagrams sent from nodes that only use source IDs and
vice-versa (not that we really care).
There is one caveat: in the current state, there is no way for the
original sender to know what the PMTU is beyond the first hop, and
contrary to the legacy protocol, relay nodes can't apply MSS clamping
because they can't decrypt the relayed packets. This leads to
inefficient scenarios where a reduced PMTU over some link that's part of
the relay path will result in relays falling back to TCP to send packets
to their final destinations.
Another caveat is that once a packet gets sent over TCP, it will use
TCP over the entire path, even if it is technically possible to use UDP
beyond the TCP-only link(s).
Arguably, these two caveats can be fixed by improving the
metaconnection protocol, but that's out of scope for this change. TODOs
are added instead. In any case, this is no worse than before.
In addition, this change increases SPTPS datagram overhead by another
6 bytes for the destination ID, on top of the existing 6-byte overhead
from the source ID.
2014-09-28 11:38:06 +00:00
|
|
|
/* MAXSIZE is the maximum size of an encapsulated packet: MTU + seqno + srcid + dstid + padding + HMAC + compressor overhead */
|
|
|
|
#define MAXSIZE (MTU + 4 + sizeof(node_id_t) + sizeof(node_id_t) + CIPHER_MAX_BLOCK_SIZE + DIGEST_MAX_SIZE + MTU/64 + 20)
|
2003-05-06 21:13:18 +00:00
|
|
|
|
2012-10-10 15:17:49 +00:00
|
|
|
/* MAXBUFSIZE is the maximum size of a request: enough for a MAXSIZEd packet or a 8192 bits RSA key */
|
|
|
|
#define MAXBUFSIZE ((MAXSIZE > 2048 ? MAXSIZE : 2048) + 128)
|
|
|
|
|
|
|
|
#define MAXSOCKETS 8 /* Probably overkill... */
|
2000-10-28 21:25:21 +00:00
|
|
|
|
2002-09-09 21:25:28 +00:00
|
|
|
typedef struct mac_t {
|
|
|
|
uint8_t x[6];
|
2000-10-11 10:35:17 +00:00
|
|
|
} mac_t;
|
|
|
|
|
2002-09-09 21:25:28 +00:00
|
|
|
typedef struct ipv4_t {
|
|
|
|
uint8_t x[4];
|
2002-02-18 16:25:19 +00:00
|
|
|
} ipv4_t;
|
2002-02-10 21:57:54 +00:00
|
|
|
|
2002-09-09 21:25:28 +00:00
|
|
|
typedef struct ipv6_t {
|
|
|
|
uint16_t x[8];
|
2002-02-10 21:57:54 +00:00
|
|
|
} ipv6_t;
|
|
|
|
|
2014-09-21 17:17:02 +00:00
|
|
|
typedef struct node_id_t {
|
|
|
|
uint8_t x[6];
|
|
|
|
} node_id_t;
|
|
|
|
|
2000-10-11 10:35:17 +00:00
|
|
|
typedef short length_t;
|
2014-12-24 21:23:24 +00:00
|
|
|
typedef uint32_t seqno_t;
|
2000-09-14 14:32:34 +00:00
|
|
|
|
2003-10-08 12:09:37 +00:00
|
|
|
#define AF_UNKNOWN 255
|
2003-08-22 11:18:42 +00:00
|
|
|
|
|
|
|
struct sockaddr_unknown {
|
|
|
|
uint16_t family;
|
|
|
|
uint16_t pad1;
|
|
|
|
uint32_t pad2;
|
|
|
|
char *address;
|
|
|
|
char *port;
|
|
|
|
};
|
|
|
|
|
2003-07-22 20:55:21 +00:00
|
|
|
typedef union sockaddr_t {
|
2002-09-09 21:25:28 +00:00
|
|
|
struct sockaddr sa;
|
|
|
|
struct sockaddr_in in;
|
|
|
|
struct sockaddr_in6 in6;
|
2003-08-22 11:18:42 +00:00
|
|
|
struct sockaddr_unknown unknown;
|
2003-07-07 11:11:33 +00:00
|
|
|
#ifdef HAVE_STRUCT_SOCKADDR_STORAGE
|
|
|
|
struct sockaddr_storage storage;
|
2003-07-06 17:15:25 +00:00
|
|
|
#endif
|
2002-02-18 16:25:19 +00:00
|
|
|
} sockaddr_t;
|
|
|
|
|
2002-02-26 22:47:51 +00:00
|
|
|
#ifdef SA_LEN
|
|
|
|
#define SALEN(s) SA_LEN(&s)
|
2002-02-20 22:15:32 +00:00
|
|
|
#else
|
2002-02-26 22:47:51 +00:00
|
|
|
#define SALEN(s) (s.sa_family==AF_INET?sizeof(struct sockaddr_in):sizeof(struct sockaddr_in6))
|
2002-02-20 22:15:32 +00:00
|
|
|
#endif
|
|
|
|
|
2014-12-24 21:23:24 +00:00
|
|
|
#define SEQNO(x) ((x)->data + (x)->offset - 4)
|
|
|
|
#define SRCID(x) ((node_id_t *)((x)->data + (x)->offset - 6))
|
|
|
|
#define DSTID(x) ((node_id_t *)((x)->data + (x)->offset - 12))
|
|
|
|
#define DATA(x) ((x)->data + (x)->offset)
|
|
|
|
#define DEFAULT_PACKET_OFFSET 12
|
|
|
|
|
2000-03-26 00:33:07 +00:00
|
|
|
typedef struct vpn_packet_t {
|
2014-12-24 21:23:24 +00:00
|
|
|
length_t len; /* The actual number of valid bytes in the `data' field (including seqno or dstid/srcid) */
|
|
|
|
length_t offset; /* Offset in the buffer where the packet data starts (righter after seqno or dstid/srcid) */
|
2012-10-10 15:17:49 +00:00
|
|
|
int priority; /* priority or TOS */
|
2002-09-09 21:25:28 +00:00
|
|
|
uint8_t data[MAXSIZE];
|
2000-03-26 00:33:07 +00:00
|
|
|
} vpn_packet_t;
|
|
|
|
|
2012-07-30 16:36:59 +00:00
|
|
|
/* Packet types when using SPTPS */
|
|
|
|
|
|
|
|
#define PKT_COMPRESSED 1
|
|
|
|
#define PKT_MAC 2
|
|
|
|
#define PKT_PROBE 4
|
|
|
|
|
|
|
|
typedef enum packet_type_t {
|
|
|
|
PACKET_NORMAL,
|
|
|
|
PACKET_COMPRESSED,
|
|
|
|
PACKET_PROBE
|
|
|
|
} packet_type_t;
|
|
|
|
|
2003-07-22 20:55:21 +00:00
|
|
|
typedef struct listen_socket_t {
|
2012-11-29 11:28:23 +00:00
|
|
|
io_t tcp;
|
|
|
|
io_t udp;
|
2003-07-22 20:55:21 +00:00
|
|
|
sockaddr_t sa;
|
2014-01-20 20:19:13 +00:00
|
|
|
bool bindto;
|
2003-07-22 20:55:21 +00:00
|
|
|
} listen_socket_t;
|
|
|
|
|
2003-07-17 15:06:27 +00:00
|
|
|
#include "conf.h"
|
2009-01-20 12:12:41 +00:00
|
|
|
#include "list.h"
|
2003-07-17 15:06:27 +00:00
|
|
|
|
2002-02-10 21:57:54 +00:00
|
|
|
typedef struct outgoing_t {
|
2002-09-09 21:25:28 +00:00
|
|
|
char *name;
|
|
|
|
int timeout;
|
2012-10-07 19:02:40 +00:00
|
|
|
splay_tree_t *config_tree;
|
2002-09-09 21:25:28 +00:00
|
|
|
struct config_t *cfg;
|
|
|
|
struct addrinfo *ai;
|
|
|
|
struct addrinfo *aip;
|
2012-11-29 11:28:23 +00:00
|
|
|
timeout_t ev;
|
2002-02-10 21:57:54 +00:00
|
|
|
} outgoing_t;
|
|
|
|
|
2009-01-20 12:12:41 +00:00
|
|
|
extern list_t *outgoing_list;
|
|
|
|
|
2006-01-19 17:13:18 +00:00
|
|
|
extern int maxoutbufsize;
|
2001-06-08 18:02:10 +00:00
|
|
|
extern int seconds_till_retry;
|
2002-02-18 16:25:19 +00:00
|
|
|
extern int addressfamily;
|
2010-11-13 18:05:50 +00:00
|
|
|
extern unsigned replaywin;
|
2012-02-22 22:17:43 +00:00
|
|
|
extern bool localdiscovery;
|
2001-06-08 18:02:10 +00:00
|
|
|
|
2002-03-18 22:47:20 +00:00
|
|
|
extern listen_socket_t listen_socket[MAXSOCKETS];
|
2002-03-01 13:18:54 +00:00
|
|
|
extern int listen_sockets;
|
2013-01-17 17:12:55 +00:00
|
|
|
extern io_t unix_socket;
|
2002-02-18 16:25:19 +00:00
|
|
|
extern int keylifetime;
|
2010-11-13 18:05:49 +00:00
|
|
|
extern int udp_rcvbuf;
|
|
|
|
extern int udp_sndbuf;
|
2013-07-11 21:38:38 +00:00
|
|
|
extern int max_connection_burst;
|
2003-07-22 20:55:21 +00:00
|
|
|
extern bool do_prune;
|
2002-02-18 16:25:19 +00:00
|
|
|
extern char *myport;
|
2014-06-22 09:48:34 +00:00
|
|
|
extern bool device_standby;
|
2014-05-06 12:11:55 +00:00
|
|
|
extern bool autoconnect;
|
2013-04-12 15:15:05 +00:00
|
|
|
extern bool disablebuggypeers;
|
2010-06-04 12:53:52 +00:00
|
|
|
extern int contradicting_add_edge;
|
|
|
|
extern int contradicting_del_edge;
|
2012-09-28 15:05:01 +00:00
|
|
|
extern time_t last_config_check;
|
2002-02-18 16:25:19 +00:00
|
|
|
|
2012-04-18 21:19:40 +00:00
|
|
|
extern char *proxyhost;
|
|
|
|
extern char *proxyport;
|
|
|
|
extern char *proxyuser;
|
|
|
|
extern char *proxypass;
|
|
|
|
typedef enum proxytype_t {
|
|
|
|
PROXY_NONE = 0,
|
|
|
|
PROXY_SOCKS4,
|
|
|
|
PROXY_SOCKS4A,
|
|
|
|
PROXY_SOCKS5,
|
|
|
|
PROXY_HTTP,
|
|
|
|
PROXY_EXEC,
|
|
|
|
} proxytype_t;
|
|
|
|
extern proxytype_t proxytype;
|
|
|
|
|
2012-10-07 15:53:23 +00:00
|
|
|
extern char *scriptinterpreter;
|
|
|
|
extern char *scriptextension;
|
|
|
|
|
2003-07-17 15:06:27 +00:00
|
|
|
/* Yes, very strange placement indeed, but otherwise the typedefs get all tangled up */
|
|
|
|
#include "connection.h"
|
|
|
|
#include "node.h"
|
|
|
|
|
2002-02-18 16:25:19 +00:00
|
|
|
extern void retry_outgoing(outgoing_t *);
|
2012-11-29 11:28:23 +00:00
|
|
|
extern void handle_incoming_vpn_data(void *, int);
|
2003-07-17 15:06:27 +00:00
|
|
|
extern void finish_connecting(struct connection_t *);
|
2012-10-07 19:02:40 +00:00
|
|
|
extern bool do_outgoing_connection(struct outgoing_t *);
|
2012-11-29 11:28:23 +00:00
|
|
|
extern void handle_new_meta_connection(void *, int);
|
2013-01-17 17:12:55 +00:00
|
|
|
extern void handle_new_unix_connection(void *, int);
|
2003-07-24 12:08:16 +00:00
|
|
|
extern int setup_listen_socket(const sockaddr_t *);
|
|
|
|
extern int setup_vpn_in_socket(const sockaddr_t *);
|
2014-12-24 21:15:40 +00:00
|
|
|
extern bool send_sptps_data(void *handle, uint8_t type, const void *data, size_t len);
|
|
|
|
extern bool receive_sptps_record(void *handle, uint8_t type, const void *data, uint16_t len);
|
2011-05-14 22:42:29 +00:00
|
|
|
extern void send_packet(struct node_t *, vpn_packet_t *);
|
2011-05-28 21:36:52 +00:00
|
|
|
extern void receive_tcppacket(struct connection_t *, const char *, int);
|
2003-07-24 12:08:16 +00:00
|
|
|
extern void broadcast_packet(const struct node_t *, vpn_packet_t *);
|
2012-03-29 15:45:25 +00:00
|
|
|
extern char *get_name(void);
|
2014-06-22 09:48:34 +00:00
|
|
|
extern void device_enable(void);
|
|
|
|
extern void device_disable(void);
|
2012-07-20 17:59:47 +00:00
|
|
|
extern bool setup_myself_reloadable(void);
|
2009-05-18 12:25:10 +00:00
|
|
|
extern bool setup_network(void);
|
2002-02-10 21:57:54 +00:00
|
|
|
extern void setup_outgoing_connection(struct outgoing_t *);
|
|
|
|
extern void try_outgoing_connections(void);
|
2000-03-26 00:33:07 +00:00
|
|
|
extern void close_network_connections(void);
|
2003-08-02 20:50:38 +00:00
|
|
|
extern int main_loop(void);
|
2003-07-22 20:55:21 +00:00
|
|
|
extern void terminate_connection(struct connection_t *, bool);
|
2011-07-16 18:21:44 +00:00
|
|
|
extern bool node_read_ecdsa_public_key(struct node_t *);
|
2011-07-07 20:28:25 +00:00
|
|
|
extern bool read_ecdsa_public_key(struct connection_t *);
|
2003-07-22 20:55:21 +00:00
|
|
|
extern bool read_rsa_public_key(struct connection_t *);
|
2003-12-20 19:47:53 +00:00
|
|
|
extern void send_mtu_probe(struct node_t *);
|
2012-11-29 11:28:23 +00:00
|
|
|
extern void handle_device_data(void *, int);
|
|
|
|
extern void handle_meta_connection_data(struct connection_t *);
|
2011-06-06 18:42:15 +00:00
|
|
|
extern void regenerate_key(void);
|
2007-11-07 02:49:57 +00:00
|
|
|
extern void purge(void);
|
2007-11-07 02:50:58 +00:00
|
|
|
extern void retry(void);
|
2007-11-07 02:51:24 +00:00
|
|
|
extern int reload_configuration(void);
|
2011-05-28 21:36:52 +00:00
|
|
|
extern void load_all_subnets(void);
|
2012-10-21 15:35:13 +00:00
|
|
|
extern void load_all_nodes(void);
|
2000-11-30 23:18:21 +00:00
|
|
|
|
2003-07-29 22:59:01 +00:00
|
|
|
#ifndef HAVE_MINGW
|
|
|
|
#define closesocket(s) close(s)
|
|
|
|
#endif
|
|
|
|
|
2012-10-10 15:17:49 +00:00
|
|
|
#endif /* __TINC_NET_H__ */
|