Home | History | Annotate | Line # | Download | only in netinet
      1 /*	$NetBSD: ip_sync.h,v 1.3 2012/07/22 14:27:51 darrenr Exp $	*/
      2 
      3 /*
      4  * Copyright (C) 2012 by Darren Reed.
      5  *
      6  * See the IPFILTER.LICENCE file for details on licencing.
      7  *
      8  * @(#)ip_fil.h	1.35 6/5/96
      9  * Id: ip_sync.h,v 2.19.2.1 2012/01/26 05:29:13 darrenr Exp
     10  */
     11 
     12 #ifndef __IP_SYNC_H__
     13 #define __IP_SYNC_H__
     14 
     15 typedef	struct	synchdr	{
     16 	u_32_t		sm_magic;	/* magic */
     17 	u_char		sm_v;		/* version: 4,6 */
     18 	u_char		sm_p;		/* protocol */
     19 	u_char		sm_cmd;		/* command */
     20 	u_char		sm_table;	/* NAT, STATE, etc */
     21 	u_int		sm_num;		/* table entry number */
     22 	int		sm_rev;		/* forward/reverse */
     23 	int		sm_len;		/* length of the data section */
     24 	struct	synclist	*sm_sl;		/* back pointer to parent */
     25 } synchdr_t;
     26 
     27 
     28 #define SYNHDRMAGIC 0x0FF51DE5
     29 
     30 /*
     31  * Commands
     32  * No delete required as expirey will take care of that!
     33  */
     34 #define	SMC_CREATE	0	/* pass ipstate_t after synchdr_t */
     35 #define	SMC_UPDATE	1
     36 #define	SMC_MAXCMD	1
     37 
     38 /*
     39  * Tables
     40  */
     41 #define	SMC_RLOG	-2	/* Only used with SIOCIPFFL */
     42 #define	SMC_NAT		0
     43 #define	SMC_STATE	1
     44 #define	SMC_MAXTBL	1
     45 
     46 
     47 /*
     48  * Only TCP requires "more" information than just a reference to the entry
     49  * for which an update is being made.
     50  */
     51 typedef	struct	synctcp_update	{
     52 	u_long		stu_age;
     53 	tcpdata_t	stu_data[2];
     54 	int		stu_state[2];
     55 } synctcp_update_t;
     56 
     57 
     58 typedef	struct	synclist	{
     59 	struct	synclist	*sl_next;
     60 	struct	synclist	**sl_pnext;
     61 	int			sl_idx;		/* update index */
     62 	struct	synchdr		sl_hdr;
     63 	union	{
     64 		struct	ipstate	*slu_ips;
     65 		struct	nat	*slu_ipn;
     66 		void		*slu_ptr;
     67 	} sl_un;
     68 } synclist_t;
     69 
     70 #define	sl_ptr	sl_un.slu_ptr
     71 #define	sl_ips	sl_un.slu_ips
     72 #define	sl_ipn	sl_un.slu_ipn
     73 #define	sl_magic sl_hdr.sm_magic
     74 #define	sl_v	sl_hdr.sm_v
     75 #define	sl_p	sl_hdr.sm_p
     76 #define	sl_cmd	sl_hdr.sm_cmd
     77 #define	sl_rev	sl_hdr.sm_rev
     78 #define	sl_table	sl_hdr.sm_table
     79 #define	sl_num	sl_hdr.sm_num
     80 #define	sl_len	sl_hdr.sm_len
     81 
     82 /*
     83  * NOTE: SYNCLOG_SZ is defined *low*.  It should be the next power of two
     84  * up for whatever number of packets per second you expect to see.  Be
     85  * warned: this index's a table of large elements (upto 272 bytes in size
     86  * each), and thus a size of 8192, for example, results in a 2MB table.
     87  * The lesson here is not to use small machines for running fast firewalls
     88  * (100BaseT) in sync, where you might have upwards of 10k pps.
     89  */
     90 #define	SYNCLOG_SZ	256
     91 
     92 typedef	struct	synclogent	{
     93 	struct	synchdr	sle_hdr;
     94 	union	{
     95 		struct	ipstate	sleu_ips;
     96 		struct	nat	sleu_ipn;
     97 	} sle_un;
     98 } synclogent_t;
     99 
    100 typedef	struct	syncupdent	{		/* 28 or 32 bytes */
    101 	struct	synchdr	sup_hdr;
    102 	struct	synctcp_update	sup_tcp;
    103 } syncupdent_t;
    104 
    105 extern	void *ipf_sync_create(ipf_main_softc_t *);
    106 extern	int ipf_sync_soft_init(ipf_main_softc_t *, void *);
    107 extern	int ipf_sync_soft_fini(ipf_main_softc_t *, void *);
    108 extern	int ipf_sync_canread(void *);
    109 extern	int ipf_sync_canwrite(void *);
    110 extern	void ipf_sync_del_nat(void *, synclist_t *);
    111 extern	void ipf_sync_del_state(void *, synclist_t *);
    112 extern	int ipf_sync_init(void);
    113 extern	int ipf_sync_ioctl(ipf_main_softc_t *, void *, ioctlcmd_t, int, int, void *);
    114 extern	synclist_t *ipf_sync_new(ipf_main_softc_t *, int, fr_info_t *, void *);
    115 extern	int ipf_sync_read(ipf_main_softc_t *, struct uio *uio);
    116 extern	int ipf_sync_write(ipf_main_softc_t *, struct uio *uio);
    117 extern	int ipf_sync_main_unload(void);
    118 extern	void ipf_sync_update(ipf_main_softc_t *, int, fr_info_t *, synclist_t *);
    119 extern	void ipf_sync_expire(ipf_main_softc_t *);
    120 extern	void	ipf_sync_soft_destroy(ipf_main_softc_t *, void *);
    121 extern	void	*ipf_sync_soft_create(ipf_main_softc_t *);
    122 
    123 #endif /* __IP_SYNC_H__ */
    124