Mercurial > notdcc
diff srvrlib/srvr_defs.h @ 0:c7f6b056b673
First import of vendor version
author | Peter Gervai <grin@grin.hu> |
---|---|
date | Tue, 10 Mar 2009 13:49:58 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/srvrlib/srvr_defs.h Tue Mar 10 13:49:58 2009 +0100 @@ -0,0 +1,260 @@ +/* Distributed Checksum Clearinghouse + * + * common server definitions + * + * Copyright (c) 2008 by Rhyolite Software, LLC + * + * This agreement is not applicable to any entity which sells anti-spam + * solutions to others or provides an anti-spam solution as part of a + * security solution sold to other entities, or to a private network + * which employs the DCC or uses data provided by operation of the DCC + * but does not provide corresponding data to other users. + * + * Permission to use, copy, modify, and distribute this software without + * changes for any purpose with or without fee is hereby granted, provided + * that the above copyright notice and this permission notice appear in all + * copies and any distributed versions or copies are either unchanged + * or not called anything similar to "DCC" or "Distributed Checksum + * Clearinghouse". + * + * Parties not eligible to receive a license under this agreement can + * obtain a commercial license to use DCC by contacting Rhyolite Software + * at sales@rhyolite.com. + * + * A commercial license would be for Distributed Checksum and Reputation + * Clearinghouse software. That software includes additional features. This + * free license for Distributed ChecksumClearinghouse Software does not in any + * way grant permision to use Distributed Checksum and Reputation Clearinghouse + * software + * + * THE SOFTWARE IS PROVIDED "AS IS" AND RHYOLITE SOFTWARE, LLC DISCLAIMS ALL + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL RHYOLITE SOFTWARE, LLC + * BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * + * Rhyolite Software DCC 1.3.103-1.85 $Revision$ + */ + +#ifndef SRVR_DEFS_H +#define SRVR_DEFS_H + +#include "dcc_clnt.h" +#include "dcc_ids.h" +#include "dcc_heap_debug.h" +#include "db.h" + +typedef int64_t SCNTR; + +typedef struct { + struct timeval reset; + SCNTR nops; /* DCC_OP_NOP packets */ + SCNTR reports; /* DCC_OP_REPORT or DCC_OP_REPORT_REP */ + SCNTR report_retrans; /* duplicate reports */ + SCNTR report_reject; /* reports ignored by -Q */ + SCNTR report10; /* reports of >10 targets */ + SCNTR report100; /* reports of >100 targets */ + SCNTR report1000; /* reports of >1000 targets */ + SCNTR reportmany; /* reports of spam */ + SCNTR queries; /* DCC_OP_QUERY */ + SCNTR resp10; /* responses of >10 targets */ + SCNTR resp100; /* " " >100 targets */ + SCNTR resp1000; /* " " >1000 targets */ + SCNTR respmany; /* " " spam */ + SCNTR respwhite; /* whitelisted responses */ + SCNTR bad_op; /* unknown, blacklisted, over active */ + SCNTR bad_passwd; /* requests with bad passwords */ + SCNTR blist; /* blacklisted requests */ + SCNTR send_error; /* error responses sent */ + SCNTR admin; /* DCC_OP_ADMN */ + SCNTR rl; /* responses rate-limited */ + SCNTR anon_rl; /* anonymous responses rate-limited */ + SCNTR adds; /* reports added */ + SCNTR iflod_total; /* total reports received */ + SCNTR iflod_accepted; /* timely and properly signed */ + SCNTR iflod_stale; + SCNTR iflod_dup; + SCNTR iflod_wlist; /* locally whitelisted */ + SCNTR iflod_not_deleted; /* delete commands ignored */ + SCNTR norep; + SCNTR rep1; + SCNTR rep10; + SCNTR rep20; + SCNTR rep30; + SCNTR rep60; + SCNTR report_reps; /* DCC_OP_REPORT_REP packets */ +} DCCD_STATS; + + +typedef char FLOD_EMSG[DCC_FLOD_MAX_RESP]; +typedef struct { + int trace_gen; /* to get at least one trace message */ + u_char complained; + FLOD_EMSG trace_msg; + FLOD_EMSG msg; +} LAST_ERROR; + + +/* memory mapped file of flooding information + * it is memory mapped so that dblist can report the state of flooding + * and so dbclean can see when flooding has stopped */ + +#define GREY_FLOD_NM "grey_flod" +#define DCCD_FLOD_NM "flod" +extern DCC_PATH flod_mmap_path, flod_path; + +#ifndef DCCD_MAX_FLOODS +#define DCCD_MAX_FLOODS 32 +#endif + +typedef struct { + /* timer and backoff for ordinary connect() */ + time_t retry; + int retry_secs; + /* timer for complaints about missing incoming connection */ + time_t msg; + int msg_secs; +} CONN_TIMERS; +typedef u_int32_t FLOD_MMAP_FLAGS; +typedef struct { + char rem_hostname[DCC_MAXDOMAINLEN]; + char rem_portname[MAXPORTNAMELEN+1]; + u_int16_t rem_port; + DCC_SOCKU rem_su; /* address for hostname */ + int host_error; /* for failure to resolve hostname */ + DB_PTR confirm_pos; /* confirmed sent to here */ + DCC_SRVR_ID rem_id, in_passwd_id, out_passwd_id; + CONN_TIMERS otimers, itimers; + time_t ids_mtime; /* mtime ids file when we checked */ + FLOD_MMAP_FLAGS flags; +# define FLODMAP_FG_MARK 0x00000001 +# define FLODMAP_FG_IN_OFF 0x00000002 +# define FLODMAP_FG_OUT_OFF 0x00000004 +# define FLODMAP_FG_ROGUE 0x00000008 /* evil server */ +# define FLODMAP_FG_IN_CONN 0x00000010 /* input connected */ +# define FLODMAP_FG_OUT_CONN 0x00000020 /* output connected */ +# define FLODMAP_FG_IPv4 0x00000040 /* override IPv6 choice */ +# define FLODMAP_FG_IPv6 0x00000080 /* override IPv6 choice */ +# define FLODMAP_FG_PASSIVE 0x00000100 /* peer uses SOCKS */ +# define FLODMAP_FG_SOCKS 0x00000200 +# define FLODMAP_FG_NAT 0x00000400 /* SOCKS without library */ +# define FLODMAP_FG_NAT_AUTO 0x00000800 /* assumed NAT */ +# define FLODMAP_FG_ACT (FLODMAP_FG_SOCKS | FLODMAP_FG_NAT \ + | FLODMAP_FG_NAT_AUTO) +# define FLODMAP_FG_OUT_SRVR 0x00001000 /* connected by peer */ +# define FLODMAP_FG_IN_SRVR 0x00002000 /* connected by peer */ +# define FLODMAP_FG_REWINDING 0x00004000 /* answering rewind */ +# define FLODMAP_FG_NEED_REWIND 0x00008000 /* database purged */ +# define FLODMAP_FG_FFWD_IN 0x00010000 /* want fastforward */ +# define FLODMAP_FG_USE_2PASSWD 0x00020000 +# define FLODMAP_FG_LEAF 0x00040000 /* path length restricted */ +# define FLODMAP_FG_MAPPED 0x00080000 /* server-IDs translated */ + u_char iversion; /* incoming flood protocol */ + struct { + time_t cnts_cleared; + time_t in_conn_changed; + time_t out_conn_changed; + u_int out_total_conn; /* seconds connected */ + u_int in_total_conn; + SCNTR out_reports; /* total reports sent */ + SCNTR total; /* received */ + SCNTR accepted; + SCNTR stale; /* too old or in the future */ + SCNTR dup; /* already received */ + SCNTR wlist; /* whitelisted */ + SCNTR not_deleted; /* delete commands ignored */ + } cnts; + LAST_ERROR oflod_err; + LAST_ERROR iflod_err; +} FLOD_MMAP; + +typedef struct { + char magic[32]; +# define FLOD_MMAP_MAGIC "DCC flod map version 18" + char pad[32-sizeof(DB_PTR)]; + DB_PTR delay_pos; /* delay flooding newer than this */ + DB_SN sn; /* ensure match with database */ + FLOD_MMAP mmaps[DCCD_MAX_FLOODS]; + DCCD_STATS dccd_stats; +} FLOD_MMAPS; +extern FLOD_MMAPS *flod_mmaps; + + +static inline void +dcc_secs2ts(DCC_TS *ts, time_t secs) +{ + u_int64_t t; + + t = ((u_int64_t)secs) << DCC_TS_SECS_LSHIFT; + ts->b[0] = t>>40; ts->b[1] = t>>32; + ts->b[2] = t>>24; ts->b[3] = t>>16; ts->b[4] = t>>8; ts->b[5] = t; +} + +static inline void +dcc_timeval2ts(DCC_TS *ts, const struct timeval *tv, int delta_secs) +{ + u_int64_t t; + + t = ((u_int64_t)tv->tv_sec+delta_secs) << DCC_TS_SECS_LSHIFT; + t += tv->tv_usec >> DCC_TS_US_RSHIFT; + ts->b[0] = t>>40; ts->b[1] = t>>32; + ts->b[2] = t>>24; ts->b[3] = t>>16; ts->b[4] = t>>8; ts->b[5] = t; +} + +static inline void +dcc_ts2timeval(struct timeval *tv, const DCC_TS *ts) +{ + u_int64_t t = ((((u_int64_t)ts->b[0])<<40) + + (((u_int64_t)ts->b[1])<<32) + + (((u_int64_t)ts->b[2])<<24) + + (((u_int64_t)ts->b[3])<<16) + + (((u_int64_t)ts->b[4])<<8) + + ts->b[5]); + tv->tv_sec = t >> DCC_TS_SECS_LSHIFT; + tv->tv_usec = ((t & DCC_TS_US_MASK) << DCC_TS_US_RSHIFT); +} + +static inline int +dcc_ts_newer_ts(const DCC_TS *ts1, const DCC_TS *ts2) +{ + return memcmp(ts1, ts2, sizeof(DCC_TS)) > 0; +} + +static inline int +dcc_ts_older_ts(const DCC_TS *ts1, const DCC_TS *ts2) +{ + return memcmp(ts1, ts2, sizeof(DCC_TS)) < 0; +} + + +#define DB_TYPE2STR(t) dcc_type2str_err(t,0,1,grey_on) + +/* not thread safe */ +extern DCC_PATH db_path_buf; +#define DB_NM2PATH_ERR(nm) fnm2abs_err(db_path_buf, nm) + + +extern void flod_mmap_path_set(void); +extern u_char flod_mmap_sync(DCC_EMSG, u_char); +extern u_char flod_unmap(DCC_EMSG, const DCCD_STATS *); +extern u_char flod_mmap(DCC_EMSG, const DB_SN *, const DCCD_STATS *, + u_char, u_char); +extern const char *flod_stats_printf(char *, int, int, int, int, int); +extern const char *flodmap_fg(char *, int, const char *, const FLOD_MMAP *); +extern int flod_running(const char *); + +extern int read_db(DCC_EMSG, void *, u_int, int, off_t, const char *); +extern u_char read_db_hdr(DCC_EMSG, DB_HDR *, int fd, const char *); +extern void read_rcd_invalidate(u_int); +extern int read_rcd(DCC_EMSG, DB_RCD *, int, off_t, const char *); + +extern char *ts2str(char *, u_int, const DCC_TS *); +extern const char *ts2str_err(const DCC_TS *); + +extern char *dcc_srvr_id2str(char *, u_int, DCC_SRVR_ID); + + +#endif /* SRVR_DEFS_H */