0
|
1 /* Distributed Checksum Clearinghouse |
|
2 * |
|
3 * common server definitions |
|
4 * |
|
5 * Copyright (c) 2008 by Rhyolite Software, LLC |
|
6 * |
|
7 * This agreement is not applicable to any entity which sells anti-spam |
|
8 * solutions to others or provides an anti-spam solution as part of a |
|
9 * security solution sold to other entities, or to a private network |
|
10 * which employs the DCC or uses data provided by operation of the DCC |
|
11 * but does not provide corresponding data to other users. |
|
12 * |
|
13 * Permission to use, copy, modify, and distribute this software without |
|
14 * changes for any purpose with or without fee is hereby granted, provided |
|
15 * that the above copyright notice and this permission notice appear in all |
|
16 * copies and any distributed versions or copies are either unchanged |
|
17 * or not called anything similar to "DCC" or "Distributed Checksum |
|
18 * Clearinghouse". |
|
19 * |
|
20 * Parties not eligible to receive a license under this agreement can |
|
21 * obtain a commercial license to use DCC by contacting Rhyolite Software |
|
22 * at sales@rhyolite.com. |
|
23 * |
|
24 * A commercial license would be for Distributed Checksum and Reputation |
|
25 * Clearinghouse software. That software includes additional features. This |
|
26 * free license for Distributed ChecksumClearinghouse Software does not in any |
|
27 * way grant permision to use Distributed Checksum and Reputation Clearinghouse |
|
28 * software |
|
29 * |
|
30 * THE SOFTWARE IS PROVIDED "AS IS" AND RHYOLITE SOFTWARE, LLC DISCLAIMS ALL |
|
31 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES |
|
32 * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL RHYOLITE SOFTWARE, LLC |
|
33 * BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES |
|
34 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, |
|
35 * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, |
|
36 * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS |
|
37 * SOFTWARE. |
|
38 * |
|
39 * Rhyolite Software DCC 1.3.103-1.85 $Revision$ |
|
40 */ |
|
41 |
|
42 #ifndef SRVR_DEFS_H |
|
43 #define SRVR_DEFS_H |
|
44 |
|
45 #include "dcc_clnt.h" |
|
46 #include "dcc_ids.h" |
|
47 #include "dcc_heap_debug.h" |
|
48 #include "db.h" |
|
49 |
|
50 typedef int64_t SCNTR; |
|
51 |
|
52 typedef struct { |
|
53 struct timeval reset; |
|
54 SCNTR nops; /* DCC_OP_NOP packets */ |
|
55 SCNTR reports; /* DCC_OP_REPORT or DCC_OP_REPORT_REP */ |
|
56 SCNTR report_retrans; /* duplicate reports */ |
|
57 SCNTR report_reject; /* reports ignored by -Q */ |
|
58 SCNTR report10; /* reports of >10 targets */ |
|
59 SCNTR report100; /* reports of >100 targets */ |
|
60 SCNTR report1000; /* reports of >1000 targets */ |
|
61 SCNTR reportmany; /* reports of spam */ |
|
62 SCNTR queries; /* DCC_OP_QUERY */ |
|
63 SCNTR resp10; /* responses of >10 targets */ |
|
64 SCNTR resp100; /* " " >100 targets */ |
|
65 SCNTR resp1000; /* " " >1000 targets */ |
|
66 SCNTR respmany; /* " " spam */ |
|
67 SCNTR respwhite; /* whitelisted responses */ |
|
68 SCNTR bad_op; /* unknown, blacklisted, over active */ |
|
69 SCNTR bad_passwd; /* requests with bad passwords */ |
|
70 SCNTR blist; /* blacklisted requests */ |
|
71 SCNTR send_error; /* error responses sent */ |
|
72 SCNTR admin; /* DCC_OP_ADMN */ |
|
73 SCNTR rl; /* responses rate-limited */ |
|
74 SCNTR anon_rl; /* anonymous responses rate-limited */ |
|
75 SCNTR adds; /* reports added */ |
|
76 SCNTR iflod_total; /* total reports received */ |
|
77 SCNTR iflod_accepted; /* timely and properly signed */ |
|
78 SCNTR iflod_stale; |
|
79 SCNTR iflod_dup; |
|
80 SCNTR iflod_wlist; /* locally whitelisted */ |
|
81 SCNTR iflod_not_deleted; /* delete commands ignored */ |
|
82 SCNTR norep; |
|
83 SCNTR rep1; |
|
84 SCNTR rep10; |
|
85 SCNTR rep20; |
|
86 SCNTR rep30; |
|
87 SCNTR rep60; |
|
88 SCNTR report_reps; /* DCC_OP_REPORT_REP packets */ |
|
89 } DCCD_STATS; |
|
90 |
|
91 |
|
92 typedef char FLOD_EMSG[DCC_FLOD_MAX_RESP]; |
|
93 typedef struct { |
|
94 int trace_gen; /* to get at least one trace message */ |
|
95 u_char complained; |
|
96 FLOD_EMSG trace_msg; |
|
97 FLOD_EMSG msg; |
|
98 } LAST_ERROR; |
|
99 |
|
100 |
|
101 /* memory mapped file of flooding information |
|
102 * it is memory mapped so that dblist can report the state of flooding |
|
103 * and so dbclean can see when flooding has stopped */ |
|
104 |
|
105 #define GREY_FLOD_NM "grey_flod" |
|
106 #define DCCD_FLOD_NM "flod" |
|
107 extern DCC_PATH flod_mmap_path, flod_path; |
|
108 |
|
109 #ifndef DCCD_MAX_FLOODS |
|
110 #define DCCD_MAX_FLOODS 32 |
|
111 #endif |
|
112 |
|
113 typedef struct { |
|
114 /* timer and backoff for ordinary connect() */ |
|
115 time_t retry; |
|
116 int retry_secs; |
|
117 /* timer for complaints about missing incoming connection */ |
|
118 time_t msg; |
|
119 int msg_secs; |
|
120 } CONN_TIMERS; |
|
121 typedef u_int32_t FLOD_MMAP_FLAGS; |
|
122 typedef struct { |
|
123 char rem_hostname[DCC_MAXDOMAINLEN]; |
|
124 char rem_portname[MAXPORTNAMELEN+1]; |
|
125 u_int16_t rem_port; |
|
126 DCC_SOCKU rem_su; /* address for hostname */ |
|
127 int host_error; /* for failure to resolve hostname */ |
|
128 DB_PTR confirm_pos; /* confirmed sent to here */ |
|
129 DCC_SRVR_ID rem_id, in_passwd_id, out_passwd_id; |
|
130 CONN_TIMERS otimers, itimers; |
|
131 time_t ids_mtime; /* mtime ids file when we checked */ |
|
132 FLOD_MMAP_FLAGS flags; |
|
133 # define FLODMAP_FG_MARK 0x00000001 |
|
134 # define FLODMAP_FG_IN_OFF 0x00000002 |
|
135 # define FLODMAP_FG_OUT_OFF 0x00000004 |
|
136 # define FLODMAP_FG_ROGUE 0x00000008 /* evil server */ |
|
137 # define FLODMAP_FG_IN_CONN 0x00000010 /* input connected */ |
|
138 # define FLODMAP_FG_OUT_CONN 0x00000020 /* output connected */ |
|
139 # define FLODMAP_FG_IPv4 0x00000040 /* override IPv6 choice */ |
|
140 # define FLODMAP_FG_IPv6 0x00000080 /* override IPv6 choice */ |
|
141 # define FLODMAP_FG_PASSIVE 0x00000100 /* peer uses SOCKS */ |
|
142 # define FLODMAP_FG_SOCKS 0x00000200 |
|
143 # define FLODMAP_FG_NAT 0x00000400 /* SOCKS without library */ |
|
144 # define FLODMAP_FG_NAT_AUTO 0x00000800 /* assumed NAT */ |
|
145 # define FLODMAP_FG_ACT (FLODMAP_FG_SOCKS | FLODMAP_FG_NAT \ |
|
146 | FLODMAP_FG_NAT_AUTO) |
|
147 # define FLODMAP_FG_OUT_SRVR 0x00001000 /* connected by peer */ |
|
148 # define FLODMAP_FG_IN_SRVR 0x00002000 /* connected by peer */ |
|
149 # define FLODMAP_FG_REWINDING 0x00004000 /* answering rewind */ |
|
150 # define FLODMAP_FG_NEED_REWIND 0x00008000 /* database purged */ |
|
151 # define FLODMAP_FG_FFWD_IN 0x00010000 /* want fastforward */ |
|
152 # define FLODMAP_FG_USE_2PASSWD 0x00020000 |
|
153 # define FLODMAP_FG_LEAF 0x00040000 /* path length restricted */ |
|
154 # define FLODMAP_FG_MAPPED 0x00080000 /* server-IDs translated */ |
|
155 u_char iversion; /* incoming flood protocol */ |
|
156 struct { |
|
157 time_t cnts_cleared; |
|
158 time_t in_conn_changed; |
|
159 time_t out_conn_changed; |
|
160 u_int out_total_conn; /* seconds connected */ |
|
161 u_int in_total_conn; |
|
162 SCNTR out_reports; /* total reports sent */ |
|
163 SCNTR total; /* received */ |
|
164 SCNTR accepted; |
|
165 SCNTR stale; /* too old or in the future */ |
|
166 SCNTR dup; /* already received */ |
|
167 SCNTR wlist; /* whitelisted */ |
|
168 SCNTR not_deleted; /* delete commands ignored */ |
|
169 } cnts; |
|
170 LAST_ERROR oflod_err; |
|
171 LAST_ERROR iflod_err; |
|
172 } FLOD_MMAP; |
|
173 |
|
174 typedef struct { |
|
175 char magic[32]; |
|
176 # define FLOD_MMAP_MAGIC "DCC flod map version 18" |
|
177 char pad[32-sizeof(DB_PTR)]; |
|
178 DB_PTR delay_pos; /* delay flooding newer than this */ |
|
179 DB_SN sn; /* ensure match with database */ |
|
180 FLOD_MMAP mmaps[DCCD_MAX_FLOODS]; |
|
181 DCCD_STATS dccd_stats; |
|
182 } FLOD_MMAPS; |
|
183 extern FLOD_MMAPS *flod_mmaps; |
|
184 |
|
185 |
|
186 static inline void |
|
187 dcc_secs2ts(DCC_TS *ts, time_t secs) |
|
188 { |
|
189 u_int64_t t; |
|
190 |
|
191 t = ((u_int64_t)secs) << DCC_TS_SECS_LSHIFT; |
|
192 ts->b[0] = t>>40; ts->b[1] = t>>32; |
|
193 ts->b[2] = t>>24; ts->b[3] = t>>16; ts->b[4] = t>>8; ts->b[5] = t; |
|
194 } |
|
195 |
|
196 static inline void |
|
197 dcc_timeval2ts(DCC_TS *ts, const struct timeval *tv, int delta_secs) |
|
198 { |
|
199 u_int64_t t; |
|
200 |
|
201 t = ((u_int64_t)tv->tv_sec+delta_secs) << DCC_TS_SECS_LSHIFT; |
|
202 t += tv->tv_usec >> DCC_TS_US_RSHIFT; |
|
203 ts->b[0] = t>>40; ts->b[1] = t>>32; |
|
204 ts->b[2] = t>>24; ts->b[3] = t>>16; ts->b[4] = t>>8; ts->b[5] = t; |
|
205 } |
|
206 |
|
207 static inline void |
|
208 dcc_ts2timeval(struct timeval *tv, const DCC_TS *ts) |
|
209 { |
|
210 u_int64_t t = ((((u_int64_t)ts->b[0])<<40) |
|
211 + (((u_int64_t)ts->b[1])<<32) |
|
212 + (((u_int64_t)ts->b[2])<<24) |
|
213 + (((u_int64_t)ts->b[3])<<16) |
|
214 + (((u_int64_t)ts->b[4])<<8) |
|
215 + ts->b[5]); |
|
216 tv->tv_sec = t >> DCC_TS_SECS_LSHIFT; |
|
217 tv->tv_usec = ((t & DCC_TS_US_MASK) << DCC_TS_US_RSHIFT); |
|
218 } |
|
219 |
|
220 static inline int |
|
221 dcc_ts_newer_ts(const DCC_TS *ts1, const DCC_TS *ts2) |
|
222 { |
|
223 return memcmp(ts1, ts2, sizeof(DCC_TS)) > 0; |
|
224 } |
|
225 |
|
226 static inline int |
|
227 dcc_ts_older_ts(const DCC_TS *ts1, const DCC_TS *ts2) |
|
228 { |
|
229 return memcmp(ts1, ts2, sizeof(DCC_TS)) < 0; |
|
230 } |
|
231 |
|
232 |
|
233 #define DB_TYPE2STR(t) dcc_type2str_err(t,0,1,grey_on) |
|
234 |
|
235 /* not thread safe */ |
|
236 extern DCC_PATH db_path_buf; |
|
237 #define DB_NM2PATH_ERR(nm) fnm2abs_err(db_path_buf, nm) |
|
238 |
|
239 |
|
240 extern void flod_mmap_path_set(void); |
|
241 extern u_char flod_mmap_sync(DCC_EMSG, u_char); |
|
242 extern u_char flod_unmap(DCC_EMSG, const DCCD_STATS *); |
|
243 extern u_char flod_mmap(DCC_EMSG, const DB_SN *, const DCCD_STATS *, |
|
244 u_char, u_char); |
|
245 extern const char *flod_stats_printf(char *, int, int, int, int, int); |
|
246 extern const char *flodmap_fg(char *, int, const char *, const FLOD_MMAP *); |
|
247 extern int flod_running(const char *); |
|
248 |
|
249 extern int read_db(DCC_EMSG, void *, u_int, int, off_t, const char *); |
|
250 extern u_char read_db_hdr(DCC_EMSG, DB_HDR *, int fd, const char *); |
|
251 extern void read_rcd_invalidate(u_int); |
|
252 extern int read_rcd(DCC_EMSG, DB_RCD *, int, off_t, const char *); |
|
253 |
|
254 extern char *ts2str(char *, u_int, const DCC_TS *); |
|
255 extern const char *ts2str_err(const DCC_TS *); |
|
256 |
|
257 extern char *dcc_srvr_id2str(char *, u_int, DCC_SRVR_ID); |
|
258 |
|
259 |
|
260 #endif /* SRVR_DEFS_H */ |