ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/connection.h
Revision: 1.3
Committed: Wed Apr 2 05:15:00 2003 UTC (21 years, 1 month ago) by pcg
Content type: text/plain
Branch: MAIN
Changes since 1.2: +2 -2 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 pcg 1.1 /*
2     connection.h -- header for connection.C
3    
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8    
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12     GNU General Public License for more details.
13    
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17     */
18    
19     #ifndef VPE_CONNECTION_H__
20     #define VPE_CONNECTION_H__
21    
22     #include <netinet/ip.h> // for tos etc.
23    
24     #include <openssl/hmac.h>
25    
26     #include "global.h"
27     #include "conf.h"
28     #include "sockinfo.h"
29     #include "util.h"
30     #include "device.h"
31    
32     struct vpn;
33    
34     // called after HUP etc. to (re-)initialize global data structures
35     void connection_init ();
36    
37     struct rsaid {
38     u8 id[RSA_IDLEN]; // the challenge id
39     };
40    
41     typedef u8 rsachallenge[RSA_KEYLEN - RSA_OVERHEAD]; // challenge data;
42     typedef u8 rsaencrdata[RSA_KEYLEN]; // encrypted challenge
43     typedef u8 rsaresponse[RSA_RESLEN]; // the encrypted ripemd160 hash
44    
45     ////////////////////////////////////////////////////////////////////////////////////////
46    
47     struct crypto_ctx;
48    
49     struct hmac_packet:net_packet
50     {
51     u8 hmac[HMACLENGTH]; // each and every packet has a hmac field, but that is not (yet) checked everywhere
52    
53     void hmac_set (crypto_ctx * ctx);
54     bool hmac_chk (crypto_ctx * ctx);
55    
56     private:
57     static unsigned char hmac_digest[EVP_MAX_MD_SIZE];
58    
59     void hmac_gen (crypto_ctx * ctx);
60     };
61    
62     struct vpn_packet : hmac_packet
63     {
64     enum ptype
65     {
66     PT_RESET = 0,
67     PT_DATA_UNCOMPRESSED,
68     PT_DATA_COMPRESSED,
69     PT_PING, PT_PONG, // wasting namespace space? ;)
70     PT_AUTH_REQ, // authentification request
71     PT_AUTH_RES, // authentification response
72     PT_CONNECT_REQ, // want other host to contact me
73     PT_CONNECT_INFO, // request connection to some node
74     PT_MAX
75     };
76    
77     u8 type;
78     u8 srcdst, src1, dst1;
79    
80     void set_hdr (ptype type, unsigned int dst);
81    
82     unsigned int src () const
83     {
84     return src1 | ((srcdst >> 4) << 8);
85     }
86    
87     unsigned int dst () const
88     {
89     return dst1 | ((srcdst & 0xf) << 8);
90     }
91    
92     ptype typ () const
93     {
94     return (ptype) type;
95     }
96     };
97    
98     ////////////////////////////////////////////////////////////////////////////////////////
99    
100     // a very simple fifo pkt-queue
101     class pkt_queue
102     {
103     tap_packet *queue[QUEUEDEPTH];
104     int i, j;
105    
106     public:
107    
108     void put (tap_packet *p);
109     tap_packet *get ();
110    
111     pkt_queue ();
112     ~pkt_queue ();
113     };
114    
115     struct connection
116     {
117     conf_node *conf;
118     struct vpn *vpn;
119    
120     sockinfo si; // the current(!) destination ip to send packets to
121     int retry_cnt;
122    
123     tstamp last_activity; // time of last packet received
124    
125     u32 oseqno;
126     sliding_window iseqno;
127    
128     u8 protocol;
129    
130     pkt_queue queue;
131    
132     crypto_ctx *octx, *ictx;
133    
134     enum conf_node::connectmode connectmode;
135     u8 prot_minor; // minor number of other side
136    
137     void reset_dstaddr ();
138    
139     void shutdown ();
140     void reset_connection ();
141     void establish_connection_cb (tstamp &ts); time_watcher establish_connection;
142     void rekey_cb (tstamp &ts); time_watcher rekey; // next rekying (actually current reset + reestablishing)
143     void keepalive_cb (tstamp &ts); time_watcher keepalive; // next keepalive probe
144    
145     void send_auth_request (const sockinfo &si, bool initiate);
146     void send_auth_response (const sockinfo &si, const rsaid &id, const rsachallenge &chg);
147     void send_connect_info (int rid, const sockinfo &rsi, u8 rprotocols);
148     void send_reset (const sockinfo &dsi);
149     void send_ping (const sockinfo &dsi, u8 pong = 0);
150     void send_data_packet (tap_packet *pkt, bool broadcast = false);
151     void inject_data_packet (tap_packet *pkt, bool broadcast = false);
152     void connect_request (int id);
153    
154     void send_vpn_packet (vpn_packet *pkt, const sockinfo &si, int tos = IPTOS_RELIABILITY);
155     void recv_vpn_packet (vpn_packet *pkt, const sockinfo &rsi);
156    
157     void script_node ();
158 pcg 1.3 const char *script_node_up ();
159     const char *script_node_down ();
160 pcg 1.1
161     void dump_status ();
162    
163     connection(struct vpn *vpn_);
164     ~connection ();
165     };
166    
167     #endif
168