/************************************************************************* * (C) 2022 CloudSigma AG - Sofia/Bulgaria * by Michael Pounov **************************************************************************/ #ifndef __FWSYNC_H #define __FWSYNC_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define IPFW_INTERNAL #include #include #include "fwsync_proto.h" #include "fwsync_utils.h" #include "fwsync_workers.h" #define IFT_FWSYNC 0xfc #define DRV_NAME "fwsync" #define DRV_VERSION 1 #define DRV_BUFSIZ 4096 #ifndef DRV_DEBUG #define DRV_DEBUG 0 #endif #ifndef STRSIZ #define STRSIZ 256 #endif #ifndef BUFSIZ #define BUFSIZ 1024 #endif MALLOC_DECLARE(M_FWSYNC); SYSCTL_DECL(_net_inet_ip); SYSCTL_DECL(_net_inet_ip_fwsync); #define FWS_DEBUG(x, fmt, ...) if ((x) <= fwsync_debug) printf((fmt), ## __VA_ARGS__) #define DTRACE() FWS_DEBUG(9, "I'm in %s at line %d into file %s\n", \ __func__, __LINE__, __FILE__) struct cfg_sync { union { struct { u_int on:2; u_int edge:1; u_int collector:1; u_int reserved:20; u_int addrs:8; } cfg; u_int cfg_mode; }; struct { union { struct sockaddr addr; struct sockaddr_in ip4; struct sockaddr_in6 ip6; }; } cfg_addr[3]; }; #define CFG_SYNC_ADDR_EDGE 0 #define CFG_SYNC_ADDR_COLLECTOR_1 1 #define CFG_SYNC_ADDR_COLLECTOR_2 2 typedef union { struct sockaddr_storage ss; struct sockaddr sa; struct sockaddr_un sun; struct sockaddr_in sin; struct sockaddr_in6 sin6; struct sockaddr_dl sdl; } sockaddr_t; #define E_SOCKADDR_INIT { .ss = { 0 } } struct fwsync_context { u_int config; u_long edge_count; struct socket *sockz[3]; struct proc *procz[3]; }; #define CTX_CFG_EDGE 0x1 #define CTX_CFG_COLLECTOR_1 0x2 #define CTX_CFG_COLLECTOR_2 0x4 #define CTX_EDGE_READY 0x8 #define CTX_COLLECTOR_1_READY 0x10 #define CTX_COLLECTOR_2_READY 0x20 #define CTX_EDGE_ONLINE 0x40 #define CTX_COLLECTOR_1_ONLINE 0x80 #define CTX_COLLECTOR_2_ONLINE 0x100 #if 0 #define DRETFLUSH _IOW('D', 1, u_char) #define DRETADDFILT _IOW('D', 2, struct dret_filter) #define DRETDELFILT _IOW('D', 3, struct dret_filter) #define DRETACCTFLUSH _IOW('D', 4, u_char) #define DRETACCTDEL _IOW('D', 5, struct tagAccount) #define DRETACCTGET _IOWR('D', 6, struct tagAccount) #define DRETDIROFF 0 #define DRETDIRIN 1 #define DRETDIROUT 2 #define DRETDIRANY 3 #define DRETACCT 4 struct dret_filter { u_char filt_dir; u_int filt_proto[8]; char filt_iface[IFNAMSIZ]; netaddr_t filt_net; }; #define FP_MASK(n) ((u_int) 1 << ((n) % 32)) #define FP_ISSET(n, a) ((a)[(n) / 32] & FP_MASK(n)) #define FP_CLR(n, a) ((a)[(n) / 32] &= ~FP_MASK(n)) #define FP_SET(n, a) ((a)[(n) / 32] |= FP_MASK(n)) #define FP_ZERO(a) do { int _i = 8; \ while (_i > 0) \ (a)[--_i] = 0; \ } while (0) #endif struct fws_sndpkt { struct fws_proto sp_proto; TAILQ_ENTRY(fws_sndpkt) sp_next; }; typedef TAILQ_HEAD(, fws_sndpkt) fwsync_sndpkt_t; extern int fwsync_debug; extern struct fwsync_context fws_ctx; extern struct cfg_sync fws_cfg; extern struct task fws_sndpkt_task; extern struct taskqueue *fws_tq; extern struct callout fws_co; extern struct mtx fws_mtx_c, fws_mtx_e, fws_mtx_u, fws_mtx_n; extern struct mbuf *fws_sndpkt; extern fwsync_sndpkt_t fwsync_sndpkt, fwsync_updpkt, fwsync_natpkt; int fwsync_cfg(struct ip_fw_chain *ch, ip_fw3_opheader *op3, struct sockopt_data *sd); int fwsync_destroy(struct ip_fw_chain *ch, ip_fw3_opheader *op3, struct sockopt_data *sd); int fwsync_get_cfg(struct ip_fw_chain *ch, ip_fw3_opheader *op3, struct sockopt_data *sd); int fwsync_list(struct ip_fw_chain *ch, ip_fw3_opheader *op3, struct sockopt_data *sd); int fwsync_start(struct ip_fw_chain *ch, ip_fw3_opheader *op3, struct sockopt_data *sd); int fwsync_stop(struct ip_fw_chain *ch, ip_fw3_opheader *op3, struct sockopt_data *sd); #endif