ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/util.h
Revision: 1.3
Committed: Fri Mar 21 23:17:01 2003 UTC (21 years, 2 months ago) by pcg
Content type: text/plain
Branch: MAIN
Changes since 1.2: +1 -38 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 /*
2 util.h -- process management and other utility functions
3 Copyright (C) 1998-2002 Ivo Timmermans <ivo@o2w.nl>
4 2000-2002 Guus Sliepen <guus@sliepen.eu.org>
5 2003 Marc Lehmannn <pcg@goof.com>
6
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
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 */
21
22 #ifndef UTIL_H__
23 #define UTIL_H__
24
25 #include <sys/socket.h>
26 #include <netinet/in.h>
27
28 #include <map>
29
30 #include "iom.h"
31 #include "device.h"
32
33 #define SOCKADDR sockaddr_in // this is lame, I know
34
35 /*
36 * check for an existing vped for this net, and write pid to pidfile
37 */
38 extern int write_pidfile (void);
39
40 /*
41 * kill older vped
42 */
43 extern int kill_other (int signal);
44
45 /*
46 * Detach from current terminal, write pidfile, kill parent
47 */
48 extern int detach (int do_detach);
49
50 /*
51 * Set all files and paths according to netname
52 */
53 extern void make_names (void);
54
55 /*
56 * check wether the given path is an absolute pathname
57 */
58 #define ABSOLUTE_PATH(c) ((c)[0] == '/')
59
60 static inline void
61 id2mac (unsigned int id, void *m)
62 {
63 mac &p = *(mac *)m;
64
65 p[0] = 0xfe;
66 p[1] = 0xfd;
67 p[2] = 0x80;
68 p[3] = 0x00;
69 p[4] = id >> 8;
70 p[5] = id;
71 }
72
73 #define mac2id(p) (p[0] & 0x01 ? 0 : (p[4] << 8) | p[5])
74
75 struct sockinfo
76 {
77 u32 host;
78 u16 port;
79
80 void set (const SOCKADDR *sa)
81 {
82 host = sa->sin_addr.s_addr;
83 port = sa->sin_port;
84 }
85
86 sockinfo()
87 {
88 host = port = 0;
89 }
90
91 sockinfo(const SOCKADDR &sa)
92 {
93 set (&sa);
94 }
95
96 sockinfo(const SOCKADDR *sa)
97 {
98 set (sa);
99 }
100
101 SOCKADDR *sa()
102 {
103 static SOCKADDR sa;
104
105 sa.sin_family = AF_INET;
106 sa.sin_port = port;
107 sa.sin_addr.s_addr = host;
108
109 return &sa;
110 }
111
112 operator const char *();
113 };
114
115 inline bool
116 operator == (const sockinfo &a, const sockinfo &b)
117 {
118 return a.host == b.host && a.port == b.port;
119 }
120
121 inline bool
122 operator < (const sockinfo &a, const sockinfo &b)
123 {
124 return a.host < b.host
125 || (a.host == b.host && a.port < b.port);
126 }
127
128 struct sliding_window {
129 u32 v[(WINDOWSIZE + 31) / 32];
130 u32 seq;
131
132 void reset (u32 seqno)
133 {
134 memset (v, -1, sizeof v);
135 seq = seqno;
136 }
137
138 bool recv_ok (u32 seqno)
139 {
140 if (seqno <= seq - WINDOWSIZE)
141 slog (L_ERR, _("received duplicate or outdated packet (received %08lx, expected %08lx)\n"
142 "possible replay attack, or just massive packet reordering"), seqno, seq + 1);//D
143 else if (seqno > seq + WINDOWSIZE)
144 slog (L_ERR, _("received duplicate or out-of-sync packet (received %08lx, expected %08lx)\n"
145 "possible replay attack, or just massive packet loss"), seqno, seq + 1);//D
146 else
147 {
148 while (seqno > seq)
149 {
150 seq++;
151
152 u32 s = seq % WINDOWSIZE;
153 u32 *cell = v + (s >> 5);
154 u32 mask = 1 << (s & 31);
155
156 *cell &= ~mask;
157 }
158
159 u32 s = seqno % WINDOWSIZE;
160 u32 *cell = v + (s >> 5);
161 u32 mask = 1 << (s & 31);
162
163 //printf ("received seqno %08lx, seq %08lx, mask %08lx is %08lx\n", seqno, seq, mask, ismask);
164 if (*cell & mask)
165 {
166 slog (L_ERR, _("received duplicate packet (received %08lx, expected %08lx)\n"
167 "possible replay attack, or just packet duplication"), seqno, seq + 1);//D
168 return false;
169 }
170 else
171 {
172 *cell |= mask;
173 return true;
174 }
175 }
176 }
177 };
178
179 #endif
180