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

# User Rev Content
1 pcg 1.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 pcg 1.3 #include "iom.h"
31 pcg 1.1 #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 pcg 1.2 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 pcg 1.1 #endif
180