blob: 7f847b500a6afb02ec889a423a1e5fbf92c469fe [file] [log] [blame]
#ifndef _CONNTRACKD_H_
#define _CONNTRACKD_H_
#include "mcast.h"
#include "local.h"
#include "alarm.h"
#include "filter.h"
#include "channel.h"
#include "internal.h"
#include <stdint.h>
#include <stdio.h>
#include <libnetfilter_conntrack/libnetfilter_conntrack.h>
#include <syslog.h>
/* UNIX facilities */
#define CT_FLUSH_MASTER 0 /* flush kernel conntrack table */
#define CT_RESYNC_MASTER 1 /* resync with kernel ct table */
#define CT_DUMP_INTERNAL 16 /* dump internal cache */
#define CT_DUMP_EXTERNAL 17 /* dump external cache */
#define CT_COMMIT 18 /* commit external cache */
#define CT_FLUSH_CACHE 19 /* flush cache */
#define KILL 20 /* kill conntrackd */
#define STATS 21 /* dump statistics */
#define SEND_BULK 22 /* send a bulk */
#define REQUEST_DUMP 23 /* request dump */
#define CT_DUMP_INT_XML 24 /* dump internal cache in XML */
#define CT_DUMP_EXT_XML 25 /* dump external cache in XML */
#define RESET_TIMERS 26 /* reset kernel timers */
#define DEBUG_INFO 27 /* unused */
#define STATS_NETWORK 28 /* extended network stats */
#define STATS_CACHE 29 /* extended cache stats */
#define STATS_RUNTIME 30 /* extended runtime stats */
#define STATS_LINK 31 /* dedicated link stats */
#define STATS_RSQUEUE 32 /* resend queue stats */
#define CT_FLUSH_INT_CACHE 33 /* flush internal cache */
#define CT_FLUSH_EXT_CACHE 34 /* flush external cache */
#define STATS_PROCESS 35 /* child process stats */
#define STATS_QUEUE 36 /* queue stats */
#define EXP_STATS 37 /* dump statistics */
#define EXP_FLUSH_MASTER 38 /* flush kernel expect table */
#define EXP_RESYNC_MASTER 39 /* resync with kernel exp table */
#define EXP_DUMP_INTERNAL 40 /* dump internal expect cache */
#define EXP_DUMP_EXTERNAL 41 /* dump external expect cache */
#define EXP_COMMIT 42 /* commit expectations */
#define ALL_FLUSH_MASTER 43 /* flush all kernel tables */
#define ALL_RESYNC_MASTER 44 /* resync w/all kernel tables */
#define ALL_FLUSH_CACHE 45 /* flush all caches */
#define ALL_COMMIT 46 /* commit all tables */
#define EXP_DUMP_INT_XML 47 /* dump internal cache in XML */
#define EXP_DUMP_EXT_XML 48 /* dump external cache in XML */
#define DEFAULT_CONFIGFILE "/etc/conntrackd/conntrackd.conf"
#define DEFAULT_LOCKFILE "/var/run/conntrackd.lock"
#define DEFAULT_LOGFILE "/var/run/conntrackd.log"
#define DEFAULT_STATS_LOGFILE "/var/run/conntrackd-stats.log"
#define DEFAULT_SYSLOG_FACILITY LOG_DAEMON
/* daemon/request modes */
#define NOT_SET 0
#define DAEMON 1
#define REQUEST 2
/* conntrackd modes */
#define CTD_SYNC_MODE (1UL << 0)
#define CTD_STATS_MODE (1UL << 1)
#define CTD_SYNC_FTFW (1UL << 2)
#define CTD_SYNC_ALARM (1UL << 3)
#define CTD_SYNC_NOTRACK (1UL << 4)
#define CTD_POLL (1UL << 5)
#define CTD_EXPECT (1UL << 6)
#define CTD_HELPER (1UL << 7)
/* FILENAME_MAX is 4096 on my system, perhaps too much? */
#ifndef FILENAME_MAXLEN
#define FILENAME_MAXLEN 256
#endif
union inet_address {
uint32_t ipv4;
uint32_t ipv6[4];
uint32_t all[4];
};
#define CONFIG(x) conf.x
struct ct_conf {
char logfile[FILENAME_MAXLEN];
int syslog_facility;
char lockfile[FILENAME_MAXLEN];
int hashsize; /* hashtable size */
int channel_num;
int channel_default;
int channel_type_global;
struct channel_conf channel[MULTICHANNEL_MAX];
struct local_conf local; /* unix socket facilities */
int nice;
int limit;
int refresh;
int cache_timeout; /* cache entries timeout */
int commit_timeout; /* committed entries timeout */
unsigned int purge_timeout; /* purge kernel entries timeout */
unsigned int netlink_buffer_size;
unsigned int netlink_buffer_size_max_grown;
int nl_overrun_resync;
unsigned int flags;
unsigned int resend_queue_size; /* FTFW protocol */
unsigned int window_size;
int poll_kernel_secs;
int filter_from_kernelspace;
int event_iterations_limit;
int systemd;
struct {
int error_queue_length;
} channelc;
struct {
int internal_cache_disable;
int external_cache_disable;
int tcp_window_tracking;
} sync;
struct {
int subsys_id;
int groups;
int events_reliable;
} netlink;
struct {
int commit_steps;
} general;
struct {
int type;
int prio;
} sched;
struct {
char logfile[FILENAME_MAXLEN];
int syslog_facility;
size_t buffer_size;
} stats;
struct {
struct list_head list;
} cthelper;
};
#define STATE(x) st.x
struct ct_general_state {
sigset_t block;
FILE *log;
FILE *stats_log;
struct local_server local;
struct ct_mode *mode;
struct ct_filter *us_filter;
struct exp_filter *exp_filter;
struct nfct_handle *event; /* event handler */
struct nfct_filter *filter; /* event filter */
int event_iterations_limit;
struct nfct_handle *dump; /* dump handler */
struct nfct_handle *resync; /* resync handler */
struct nfct_handle *get; /* get handler */
int get_retval; /* hackish */
struct nfct_handle *flush; /* flusher */
struct alarm_block resync_alarm;
struct alarm_block polling_alarm;
struct fds *fds;
/* statistics */
struct {
uint64_t bytes_orig;
uint64_t bytes_repl;
uint64_t packets_orig;
uint64_t packets_repl;
time_t daemon_start_time;
uint64_t nl_events_received;
uint64_t nl_events_filtered;
uint32_t nl_events_unknown_type;
uint32_t nl_catch_event_failed;
uint32_t nl_overrun;
uint32_t nl_dump_unknown_type;
uint32_t nl_kernel_table_flush;
uint32_t nl_kernel_table_resync;
uint32_t child_process_failed;
uint32_t child_process_error_segfault;
uint32_t child_process_error_term;
uint32_t select_failed;
uint32_t wait_failed;
uint32_t local_read_failed;
uint32_t local_unknown_request;
} stats;
};
struct commit_runqueue {
int (*cb)(struct nfct_handle *h, int step);
};
#define STATE_SYNC(x) state.sync->x
struct ct_sync_state {
struct external_handler *external;
struct multichannel *channel;
struct nlif_handle *interface;
struct queue *tx_queue;
#define COMMIT_STATE_INACTIVE 0
#define COMMIT_STATE_MASTER 1
#define COMMIT_STATE_RELATED 2
struct {
int state;
int clientfd;
struct nfct_handle *h;
struct evfd *evfd;
int current;
struct commit_runqueue rq[2];
struct {
int ok;
int fail;
struct timeval start;
} stats;
} commit;
struct alarm_block reset_cache_alarm;
struct sync_mode *sync; /* sync mode */
/* statistics */
struct {
uint64_t msg_rcv_malformed;
uint32_t msg_rcv_bad_version;
uint32_t msg_rcv_bad_payload;
uint32_t msg_rcv_bad_header;
uint32_t msg_rcv_bad_type;
uint32_t msg_rcv_truncated;
uint32_t msg_rcv_bad_size;
uint32_t msg_snd_malformed;
uint64_t msg_rcv_lost;
uint64_t msg_rcv_before;
} error;
uint32_t last_seq_sent; /* last sequence number sent */
uint32_t last_seq_recv; /* last sequence number recv */
};
#define STATE_STATS(x) state.stats->x
struct ct_stats_state {
struct cache *cache; /* internal events cache (netlink) */
};
#define STATE_CTH(x) state.cthelper->x
struct ct_helper_state {
struct mnl_socket *nl;
uint32_t portid;
};
struct ct_state {
struct ct_sync_state *sync;
struct ct_stats_state *stats;
struct ct_helper_state *cthelper;
};
extern struct ct_conf conf;
extern struct ct_state state;
extern struct ct_general_state st;
struct ct_mode {
struct internal_handler *internal;
int (*init)(void);
int (*local)(int fd, int type, void *data);
void (*kill)(void);
};
/* basic ctnl functions */
void ctnl_kill(void);
int ctnl_local(int fd, int type, void *data);
int ctnl_init(void);
/* basic cthelper functions */
void cthelper_kill(void);
int cthelper_local(int fd, int type, void *data);
int cthelper_init(void);
/* conntrackd ctnl modes */
extern struct ct_mode sync_mode;
extern struct ct_mode stats_mode;
#define MAX(x, y) x > y ? x : y
/* These live in run.c */
void killer(int foo);
int init(void);
void select_main_loop(void);
/* from read_config_yy.c */
int
init_config(char *filename);
#endif