/*************************************************************************
* (C) 2022 CloudSigma AG - Sofia/Bulgaria
* by Michael Pounov <misho@elwix.org>
**************************************************************************/
#ifndef __FWSYNC_H
#define __FWSYNC_H
#include <sys/types.h>
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/errno.h>
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/conf.h>
#include <machine/atomic.h>
#include <sys/malloc.h>
#include <sys/sysctl.h>
#include <sys/mbuf.h>
#include <sys/socket.h>
#include <sys/socketvar.h>
#include <sys/un.h>
#include <sys/module.h>
#include <sys/kthread.h>
#include <sys/taskqueue.h>
#include <sys/uio.h>
#include <sys/poll.h>
#include <net/if.h>
#include <net/if_var.h>
#include <net/if_dl.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ip_var.h>
#include <netinet/udp.h>
#define IPFW_INTERNAL
#include <netinet/ip_fw.h>
#include <netpfil/ipfw/ip_fw_private.h>
#include "fwsync_proto.h"
#include "fwsync_workers.h"
#if 0
#include <sys/uio.h>
#include <sys/taskqueue.h>
#include <sys/rwlock.h>
#include <sys/queue.h>
#include <sys/tree.h>
#include <sys/ioccom.h>
#include <sys/poll.h>
#include <sys/event.h>
#include <sys/selinfo.h>
#include <sys/fcntl.h>
#include <sys/syslog.h>
#include <sys/rwlock.h>
#endif
#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 DRV_PKTSTART 0xDEADBEEF
#define DRV_PKTEND 0xDEBADEBA
#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
extern int fwsync_debug;
extern struct fwsync_context fws_ctx;
extern struct cfg_sync fws_cfg;
extern struct task fws_sndpkt_task;
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
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>