ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/util.h
(Generate patch)

Comparing gvpe/src/util.h (file contents):
Revision 1.2 by pcg, Mon Mar 17 15:20:18 2003 UTC vs.
Revision 1.12 by pcg, Mon May 10 20:13:10 2004 UTC

1/* 1/*
2 util.h -- process management and other utility functions 2 util.h -- process management and other utility functions
3 Copyright (C) 1998-2002 Ivo Timmermans <ivo@o2w.nl> 3 Copyright (C) 1998-2002 Ivo Timmermans <ivo@o2w.nl>
4 2000-2002 Guus Sliepen <guus@sliepen.eu.org> 4 2000-2002 Guus Sliepen <guus@sliepen.eu.org>
5 2003 Marc Lehmannn <pcg@goof.com> 5 2003 Marc Lehmann <pcg@goof.com>
6 6
7 This program is free software; you can redistribute it and/or modify 7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by 8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or 9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version. 10 (at your option) any later version.
20*/ 20*/
21 21
22#ifndef UTIL_H__ 22#ifndef UTIL_H__
23#define UTIL_H__ 23#define UTIL_H__
24 24
25#include <sys/socket.h> 25#include <openssl/rsa.h>
26#include <netinet/in.h>
27 26
28#include <map> 27#include "gettext.h"
29 28
29#include "slog.h"
30#include "device.h" 30#include "iom.h"
31
32#define SOCKADDR sockaddr_in // this is lame, I know
33 31
34/* 32/*
35 * check for an existing vped for this net, and write pid to pidfile 33 * check for an existing vped for this net, and write pid to pidfile
36 */ 34 */
37extern int write_pidfile (void); 35extern int write_pidfile (void);
45 * Detach from current terminal, write pidfile, kill parent 43 * Detach from current terminal, write pidfile, kill parent
46 */ 44 */
47extern int detach (int do_detach); 45extern int detach (int do_detach);
48 46
49/* 47/*
50 * Set all files and paths according to netname
51 */
52extern void make_names (void);
53
54/*
55 * check wether the given path is an absolute pathname 48 * check wether the given path is an absolute pathname
56 */ 49 */
57#define ABSOLUTE_PATH(c) ((c)[0] == '/') 50#define ABSOLUTE_PATH(c) ((c)[0] == '/')
58 51
59static inline void 52/*****************************************************************************/
60id2mac (unsigned int id, void *m)
61{
62 mac &p = *(mac *)m;
63 53
64 p[0] = 0xfe; 54typedef u8 mac[6];
65 p[1] = 0xfd;
66 p[2] = 0x80;
67 p[3] = 0x00;
68 p[4] = id >> 8;
69 p[5] = id;
70}
71 55
72#define mac2id(p) (p[0] & 0x01 ? 0 : (p[4] << 8) | p[5]) 56extern void id2mac (unsigned int id, void *m);
73 57
74// a very simple fifo pkt-queue 58#define mac2id(p) ((p)[0] & 0x01 ? 0 : ((p)[4] << 8) | (p)[5])
75class pkt_queue
76 {
77 tap_packet *queue[QUEUEDEPTH];
78 int i, j;
79
80 public:
81
82 void put (tap_packet *p);
83 tap_packet *get ();
84
85 pkt_queue ();
86 ~pkt_queue ();
87 };
88
89struct sockinfo
90 {
91 u32 host;
92 u16 port;
93
94 void set (const SOCKADDR *sa)
95 {
96 host = sa->sin_addr.s_addr;
97 port = sa->sin_port;
98 }
99
100 sockinfo()
101 {
102 host = port = 0;
103 }
104
105 sockinfo(const SOCKADDR &sa)
106 {
107 set (&sa);
108 }
109
110 sockinfo(const SOCKADDR *sa)
111 {
112 set (sa);
113 }
114
115 SOCKADDR *sa()
116 {
117 static SOCKADDR sa;
118
119 sa.sin_family = AF_INET;
120 sa.sin_port = port;
121 sa.sin_addr.s_addr = host;
122
123 return &sa;
124 }
125
126 operator const char *();
127 };
128
129inline bool
130operator == (const sockinfo &a, const sockinfo &b)
131{
132 return a.host == b.host && a.port == b.port;
133}
134
135inline bool
136operator < (const sockinfo &a, const sockinfo &b)
137{
138 return a.host < b.host
139 || (a.host == b.host && a.port < b.port);
140}
141
142// only do action once every x seconds per host.
143// currently this is quite a slow implementation,
144// but suffices for normal operation.
145struct u32_rate_limiter : private map<u32, time_t>
146 {
147 int every;
148
149 bool can (u32 host);
150
151 u32_rate_limiter (time_t every = 1)
152 {
153 this->every = every;
154 }
155 };
156
157struct net_rate_limiter : u32_rate_limiter
158 {
159 bool can (SOCKADDR *sa) { return u32_rate_limiter::can((u32)sa->sin_addr.s_addr); }
160 bool can (sockinfo &si) { return u32_rate_limiter::can((u32)si.host); }
161
162 net_rate_limiter (time_t every) : u32_rate_limiter (every) {}
163 };
164 59
165struct sliding_window { 60struct sliding_window {
166 u32 v[(WINDOWSIZE + 31) / 32]; 61 u32 v[(WINDOWSIZE + 31) / 32];
167 u32 seq; 62 u32 seq;
168 63
195 90
196 u32 s = seqno % WINDOWSIZE; 91 u32 s = seqno % WINDOWSIZE;
197 u32 *cell = v + (s >> 5); 92 u32 *cell = v + (s >> 5);
198 u32 mask = 1 << (s & 31); 93 u32 mask = 1 << (s & 31);
199 94
200 //printf ("received seqno %08lx, seq %08lx, mask %08lx is %08lx\n", seqno, seq, mask, ismask);
201 if (*cell & mask) 95 if (*cell & mask)
202 { 96 {
203 slog (L_ERR, _("received duplicate packet (received %08lx, expected %08lx)\n" 97 slog (L_ERR, _("received duplicate packet (received %08lx, expected %08lx)\n"
204 "possible replay attack, or just packet duplication"), seqno, seq + 1);//D 98 "possible replay attack, or just packet duplication"), seqno, seq + 1);//D
205 return false; 99 return false;
211 } 105 }
212 } 106 }
213 } 107 }
214}; 108};
215 109
110typedef callback0<const char *> run_script_cb;
111
112// run a shell script (or actually an external program).
113void run_script (const run_script_cb &cb, bool wait);
114
115#if ENABLE_HTTP_PROXY
116u8 *base64_encode (const u8 *data, unsigned int len);
216#endif 117#endif
217 118
119/*****************************************************************************/
120
121typedef u8 rsaclear[RSA_KEYLEN - RSA_OVERHEAD]; // challenge data;
122typedef u8 rsacrypt[RSA_KEYLEN]; // encrypted challenge
123
124static inline void
125rsa_encrypt (RSA *key, const rsaclear &chg, rsacrypt &encr)
126{
127 if (RSA_public_encrypt (sizeof chg,
128 (unsigned char *)&chg, (unsigned char *)&encr,
129 key, RSA_PKCS1_OAEP_PADDING) < 0)
130 fatal ("RSA_public_encrypt error");
131}
132
133static inline bool
134rsa_decrypt (RSA *key, const rsacrypt &encr, rsaclear &chg)
135{
136 return RSA_private_decrypt (sizeof encr,
137 (unsigned char *)&encr, (unsigned char *)&chg,
138 key, RSA_PKCS1_OAEP_PADDING) > 0;
139}
140
141#endif
142

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines