--- gvpe/src/connection.h 2003/04/05 02:32:40 1.5 +++ gvpe/src/connection.h 2005/12/05 12:58:09 1.27 @@ -1,7 +1,10 @@ /* connection.h -- header for connection.C + Copyright (C) 2003-2005 Marc Lehmann - This program is free software; you can redistribute it and/or modify + This file is part of GVPE. + + GVPE 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. @@ -12,12 +15,12 @@ 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. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + along with gvpe; if not, write to the Free Software + Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef VPE_CONNECTION_H__ -#define VPE_CONNECTION_H__ +#ifndef GVPE_CONNECTION_H__ +#define GVPE_CONNECTION_H__ #include @@ -36,15 +39,15 @@ u8 id[RSA_IDLEN]; // the challenge id }; -typedef u8 rsachallenge[RSA_KEYLEN - RSA_OVERHEAD]; // challenge data; -typedef u8 rsaencrdata[RSA_KEYLEN]; // encrypted challenge +typedef rsaclear rsachallenge; // challenge data; +typedef rsacrypt rsaencrdata; // encrypted challenge typedef u8 rsaresponse[RSA_RESLEN]; // the encrypted ripemd160 hash //////////////////////////////////////////////////////////////////////////////////////// struct crypto_ctx; -struct hmac_packet:net_packet +struct hmac_packet : net_packet { u8 hmac[HMACLENGTH]; // each and every packet has a hmac field, but that is not (yet) checked everywhere @@ -67,8 +70,9 @@ PT_PING, PT_PONG, // wasting namespace space? ;) PT_AUTH_REQ, // authentification request PT_AUTH_RES, // authentification response - PT_CONNECT_REQ, // want other host to contact me + PT_CONNECT_REQ, // want other node to contact me PT_CONNECT_INFO, // request connection to some node + PT_DATA_BRIDGED, // uncompressed packet with foreign mac pot. larger than path mtu PT_MAX }; @@ -98,18 +102,25 @@ // a very simple fifo pkt-queue class pkt_queue { - tap_packet *queue[QUEUEDEPTH]; + net_packet *queue[QUEUEDEPTH]; int i, j; public: - void put (tap_packet *p); - tap_packet *get (); + void put (net_packet *p); + net_packet *get (); pkt_queue (); ~pkt_queue (); }; +enum + { + FEATURE_COMPRESSION = 0x01, + FEATURE_ROHC = 0x02, + FEATURE_BRIDGING = 0x04, + }; + struct connection { conf_node *conf; @@ -124,40 +135,54 @@ sliding_window iseqno; u8 protocol; + u8 features; - pkt_queue queue; + pkt_queue data_queue, vpn_queue; crypto_ctx *octx, *ictx; +#if ENABLE_DNS + struct dns_connection *dns; + + void dnsv4_reset_connection (); +#endif + enum conf_node::connectmode connectmode; u8 prot_minor; // minor number of other side - void reset_dstaddr (); + void reset_si (); + const sockinfo &forward_si (const sockinfo &si) const; void shutdown (); + void connection_established (); void reset_connection (); + void establish_connection_cb (time_watcher &w); time_watcher establish_connection; void rekey_cb (time_watcher &w); time_watcher rekey; // next rekying (actually current reset + reestablishing) void keepalive_cb (time_watcher &w); time_watcher keepalive; // next keepalive probe + void send_connect_request (int id); void send_auth_request (const sockinfo &si, bool initiate); void send_auth_response (const sockinfo &si, const rsaid &id, const rsachallenge &chg); void send_connect_info (int rid, const sockinfo &rsi, u8 rprotocols); void send_reset (const sockinfo &dsi); void send_ping (const sockinfo &dsi, u8 pong = 0); - void send_data_packet (tap_packet *pkt, bool broadcast = false); + void send_data_packet (tap_packet *pkt); + void inject_data_packet (tap_packet *pkt, bool broadcast = false); - void connect_request (int id); + void inject_vpn_packet (vpn_packet *pkt, int tos = 0); // for forwarding void recv_vpn_packet (vpn_packet *pkt, const sockinfo &rsi); + void send_vpn_packet (vpn_packet *pkt, const sockinfo &si, int tos = 0); - void script_node (); + void script_init_env (const char *ext); + void script_init_connect_env (); const char *script_node_up (); const char *script_node_down (); void dump_status (); - connection(struct vpn *vpn_); + connection (struct vpn *vpn, conf_node *conf); ~connection (); };