X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fprotocol.h;h=6c46c726055605a191891197441c361a51b2c7d4;hp=7e0e898850ca29c7f0b1f642e7b645bacbbcf31a;hb=0eceee6a66b28535a9c44d282e07a5825c7a1f04;hpb=b6997b0050e78a2f2e517beba3ff01d9232b3d1f diff --git a/src/protocol.h b/src/protocol.h index 7e0e8988..6c46c726 100644 --- a/src/protocol.h +++ b/src/protocol.h @@ -1,6 +1,7 @@ /* protocol.h -- header for protocol.c - Copyright (C) 1999,2000 Ivo Timmermans + Copyright (C) 1999-2005 Ivo Timmermans, + 2000-2009 Guus Sliepen 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 @@ -12,71 +13,113 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - 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., 675 Mass Ave, Cambridge, MA 02139, USA. - - $Id: protocol.h,v 1.5.4.5 2000/08/07 16:27:29 guus Exp $ + 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. */ #ifndef __TINC_PROTOCOL_H__ #define __TINC_PROTOCOL_H__ +/* Protocol version. Different versions are incompatible, + incompatible version have different protocols. + */ + +#define PROT_CURRENT 17 + +/* Silly Windows */ + +#ifdef ERROR +#undef ERROR +#endif + +/* Request numbers */ + +typedef enum request_t { + ALL = -1, /* Guardian for allow_request */ + ID = 0, METAKEY, CHALLENGE, CHAL_REPLY, ACK, + STATUS, ERROR, TERMREQ, + PING, PONG, + ADD_SUBNET, DEL_SUBNET, + ADD_EDGE, DEL_EDGE, + KEY_CHANGED, REQ_KEY, ANS_KEY, + PACKET, + LAST /* Guardian for the highest request number */ +} request_t; + +typedef struct past_request_t { + char *request; + time_t firstseen; +} past_request_t; + +extern bool tunnelserver; +extern bool strictsubnets; + +/* Maximum size of strings in a request. + * scanf terminates %2048s with a NUL character, + * but the NUL character can be written after the 2048th non-NUL character. + */ + +#define MAX_STRING_SIZE 2049 +#define MAX_STRING "%2048s" + +#include "edge.h" #include "net.h" +#include "node.h" +#include "subnet.h" + +/* Basic functions */ + +extern bool send_request(struct connection_t *, const char *, ...) __attribute__ ((__format__(printf, 2, 3))); +extern void forward_request(struct connection_t *); +extern bool receive_request(struct connection_t *); +extern bool check_id(const char *); + +extern void init_requests(void); +extern void exit_requests(void); +extern bool seen_request(char *); +extern void age_past_requests(void); + +/* Requests */ + +extern bool send_id(struct connection_t *); +extern bool send_metakey(struct connection_t *); +extern bool send_challenge(struct connection_t *); +extern bool send_chal_reply(struct connection_t *); +extern bool send_ack(struct connection_t *); +extern bool send_status(struct connection_t *, int, const char *); +extern bool send_error(struct connection_t *, int,const char *); +extern bool send_termreq(struct connection_t *); +extern bool send_ping(struct connection_t *); +extern bool send_pong(struct connection_t *); +extern bool send_add_subnet(struct connection_t *, const struct subnet_t *); +extern bool send_del_subnet(struct connection_t *, const struct subnet_t *); +extern bool send_add_edge(struct connection_t *, const struct edge_t *); +extern bool send_del_edge(struct connection_t *, const struct edge_t *); +extern void send_key_changed(void); +extern bool send_req_key(struct node_t *); +extern bool send_ans_key(struct node_t *); +extern bool send_tcppacket(struct connection_t *, const struct vpn_packet_t *); -enum { - PROT_RESERVED = 0, /* reserved: do not use. */ - PROT_NOT_IN_USE, - PROT_TOO_OLD = 2, - PROT_3, - PROT_4, - PROT_ECHELON, - PROT_6, - PROT_CURRENT, /* protocol currently in use */ -}; - -enum { - ACK = 1, /* acknowledged */ - AUTH_S_INIT = 10, /* initiate authentication */ - AUTH_C_INIT, - AUTH_S_SPP, /* send passphrase */ - AUTH_C_SPP, - AUTH_S_SKEY, /* send g^k */ - AUTH_C_SKEY, - AUTH_S_SACK, /* send ack */ - AUTH_C_RACK, /* waiting for ack */ - TERMREQ = 30, /* terminate connection */ - PINGTIMEOUT, /* terminate due to ping t.o. */ - DEL_HOST, /* forward a termreq to others */ - PING = 40, /* ping */ - PONG, - ADD_HOST = 60, /* Add new given host to connection list */ - BASIC_INFO, /* some basic info follows */ - PASSPHRASE, /* encrypted passphrase */ - PUBLIC_KEY, /* public key in base-36 */ - HOLD = 80, /* don't send any data */ - RESUME, /* resume dataflow with new encryption key */ - CALCULATE = 100, /* calculate the following numer^privkey and send me the result */ - CALC_RES, /* result of the above */ - ALMOST_KEY, /* this number^privkey is the shared key */ - PACKET = 110, /* TCP tunneled network packet */ - REQ_KEY = 160, /* request public key */ - ANS_KEY, /* answer to such request */ - KEY_CHANGED, /* public key has changed */ -}; - -extern int (*request_handlers[256])(conn_list_t*); - -extern int send_ping(conn_list_t*); -extern int send_basic_info(conn_list_t *); -extern int send_termreq(conn_list_t *); -extern int send_timeout(conn_list_t *); -extern int send_key_request(ip_t); -extern void send_key_changed_all(void); -extern int send_del_host(conn_list_t *, conn_list_t *); -extern int send_tcppacket(conn_list_t *, void *, int); -extern int notify_others(conn_list_t *, conn_list_t *, int (*function)(conn_list_t*, conn_list_t*)); - -#endif /* __TINC_PROTOCOL_H__ */ +/* Request handlers */ +extern bool id_h(struct connection_t *); +extern bool metakey_h(struct connection_t *); +extern bool challenge_h(struct connection_t *); +extern bool chal_reply_h(struct connection_t *); +extern bool ack_h(struct connection_t *); +extern bool status_h(struct connection_t *); +extern bool error_h(struct connection_t *); +extern bool termreq_h(struct connection_t *); +extern bool ping_h(struct connection_t *); +extern bool pong_h(struct connection_t *); +extern bool add_subnet_h(struct connection_t *); +extern bool del_subnet_h(struct connection_t *); +extern bool add_edge_h(struct connection_t *); +extern bool del_edge_h(struct connection_t *); +extern bool key_changed_h(struct connection_t *); +extern bool req_key_h(struct connection_t *); +extern bool ans_key_h(struct connection_t *); +extern bool tcppacket_h(struct connection_t *); +#endif /* __TINC_PROTOCOL_H__ */