File:  [ELWIX - Embedded LightWeight unIX -] / fwsync / driver / fwsync.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Jun 22 13:01:55 2022 UTC (22 months, 3 weeks ago) by misho
Branches: misho
CVS tags: start, fwsync1_0
FWSync driver

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