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 | |