view 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 source

/* 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 */