ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/connection.h
Revision: 1.13
Committed: Tue Jan 27 05:56:35 2004 UTC (20 years, 4 months ago) by pcg
Content type: text/plain
Branch: MAIN
Changes since 1.12: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

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