2 * Copyright (C) 1993-1998 by Darren Reed.
4 * Redistribution and use in source and binary forms are permitted
5 * provided that this notice is preserved and due credit is given
6 * to the original author and the contributors.
8 * @(#)ip_fil.h 1.35 6/5/96
9 * $Id: ip_fil.h,v 2.3.2.7 2000/01/27 08:49:41 darrenr Exp $
16 * Pathnames for various IP Filter control devices. Used by LKM
17 * and userland, so defined here.
19 #define IPNAT_NAME "/dev/ipnat"
20 #define IPSTATE_NAME "/dev/ipstate"
21 #define IPAUTH_NAME "/dev/ipauth"
24 # define SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4)))
27 #if defined(KERNEL) && !defined(_KERNEL)
39 #if defined(__STDC__) || defined(__GNUC__)
40 # define SIOCADAFR _IOW('r', 60, struct frentry)
41 # define SIOCRMAFR _IOW('r', 61, struct frentry)
42 # define SIOCSETFF _IOW('r', 62, u_int)
43 # define SIOCGETFF _IOR('r', 63, u_int)
44 # define SIOCGETFS _IOR('r', 64, struct friostat)
45 # define SIOCIPFFL _IOWR('r', 65, int)
46 # define SIOCIPFFB _IOR('r', 66, int)
47 # define SIOCADIFR _IOW('r', 67, struct frentry)
48 # define SIOCRMIFR _IOW('r', 68, struct frentry)
49 # define SIOCSWAPA _IOR('r', 69, u_int)
50 # define SIOCINAFR _IOW('r', 70, struct frentry)
51 # define SIOCINIFR _IOW('r', 71, struct frentry)
52 # define SIOCFRENB _IOW('r', 72, u_int)
53 # define SIOCFRSYN _IOW('r', 73, u_int)
54 # define SIOCFRZST _IOWR('r', 74, struct friostat)
55 # define SIOCZRLST _IOWR('r', 75, struct frentry)
56 # define SIOCAUTHW _IOWR('r', 76, struct fr_info)
57 # define SIOCAUTHR _IOWR('r', 77, struct fr_info)
58 # define SIOCATHST _IOWR('r', 78, struct fr_authstat)
60 # define SIOCADAFR _IOW(r, 60, struct frentry)
61 # define SIOCRMAFR _IOW(r, 61, struct frentry)
62 # define SIOCSETFF _IOW(r, 62, u_int)
63 # define SIOCGETFF _IOR(r, 63, u_int)
64 # define SIOCGETFS _IOR(r, 64, struct friostat)
65 # define SIOCIPFFL _IOWR(r, 65, int)
66 # define SIOCIPFFB _IOR(r, 66, int)
67 # define SIOCADIFR _IOW(r, 67, struct frentry)
68 # define SIOCRMIFR _IOW(r, 68, struct frentry)
69 # define SIOCSWAPA _IOR(r, 69, u_int)
70 # define SIOCINAFR _IOW(r, 70, struct frentry)
71 # define SIOCINIFR _IOW(r, 71, struct frentry)
72 # define SIOCFRENB _IOW(r, 72, u_int)
73 # define SIOCFRSYN _IOW(r, 73, u_int)
74 # define SIOCFRZST _IOWR(r, 74, struct friostat)
75 # define SIOCZRLST _IOWR(r, 75, struct frentry)
76 # define SIOCAUTHW _IOWR(r, 76, struct fr_info)
77 # define SIOCAUTHR _IOWR(r, 77, struct fr_info)
78 # define SIOCATHST _IOWR(r, 78, struct fr_authstat)
80 #define SIOCADDFR SIOCADAFR
81 #define SIOCDELFR SIOCRMAFR
82 #define SIOCINSFR SIOCINAFR
84 typedef struct fr_ip {
85 u_char fi_v:4; /* IP version */
86 u_char fi_fl:4; /* packet flags */
87 u_char fi_tos; /* IP packet TOS */
88 u_char fi_ttl; /* IP packet TTL */
89 u_char fi_p; /* IP packet protocol */
90 struct in_addr fi_src; /* source address from packet */
91 struct in_addr fi_dst; /* destination address from packet */
92 u_32_t fi_optmsk; /* bitmask composed from IP options */
93 u_short fi_secmsk; /* bitmask composed from IP security options */
94 u_short fi_auth; /* authentication code from IP sec. options */
97 #define FI_OPTIONS (FF_OPTIONS >> 24)
98 #define FI_TCPUDP (FF_TCPUDP >> 24) /* TCP/UCP implied comparison*/
99 #define FI_FRAG (FF_FRAG >> 24)
100 #define FI_SHORT (FF_SHORT >> 24)
101 #define FI_CMP (FI_OPTIONS|FI_TCPUDP|FI_SHORT)
104 * These are both used by the state and NAT code to indicate that one port or
105 * the other should be treated as a wildcard.
107 #define FI_W_SPORT 0x00000100
108 #define FI_W_DPORT 0x00000200
109 #define FI_WILD (FI_W_SPORT|FI_W_DPORT)
111 typedef struct fr_info {
112 void *fin_ifp; /* interface packet is `on' */
113 struct fr_ip fin_fi; /* IP Packet summary */
114 u_short fin_data[2]; /* TCP/UDP ports, ICMP code/type */
115 u_char fin_out; /* in or out ? 1 == out, 0 == in */
116 u_char fin_rev; /* state only: 1 = reverse */
117 u_short fin_hlen; /* length of IP header in bytes */
118 u_char fin_tcpf; /* TCP header flags (SYN, ACK, etc) */
119 /* From here on is packet specific */
120 u_char fin_icode; /* ICMP error to return */
121 u_short fin_rule; /* rule # last matched */
122 u_short fin_group; /* group number, -1 for none */
123 struct frentry *fin_fr; /* last matching rule */
124 char *fin_dp; /* start of data past IP header */
125 u_short fin_dlen; /* length of data portion of packet */
126 u_short fin_id; /* IP packet id field */
127 void *fin_mp; /* pointer to pointer to mbuf */
128 #if SOLARIS && defined(_KERNEL)
129 void *fin_qfm; /* pointer to mblk where pkt starts */
135 * Size for compares on fr_info structures
137 #define FI_CSIZE offsetof(fr_info_t, fin_icode)
140 * Size for copying cache fr_info structure
142 #define FI_COPYSIZE offsetof(fr_info_t, fin_dp)
144 typedef struct frdest {
146 struct in_addr fd_ip;
147 char fd_ifname[IFNAMSIZ];
150 typedef struct frentry {
151 struct frentry *fr_next;
152 u_short fr_group; /* group to which this rule belongs */
153 u_short fr_grhead; /* group # which this rule starts */
154 struct frentry *fr_grp;
155 int fr_ref; /* reference count - for grouping */
161 * These are only incremented when a packet matches this rule and
162 * it is the last match
167 * Fields after this may not change whilst in the kernel.
170 struct fr_ip fr_mip; /* mask structure */
172 u_char fr_tcpfm; /* tcp flags mask */
173 u_char fr_tcpf; /* tcp flags */
175 u_short fr_icmpm; /* data for ICMP packets (mask) */
178 u_char fr_scmp; /* data for port comparisons */
182 u_short fr_stop; /* top port for <> and >< */
183 u_short fr_dtop; /* top port for <> and >< */
184 u_32_t fr_flags; /* per-rule flags && options (see below) */
185 u_short fr_skip; /* # of rules to skip */
186 u_short fr_loglevel; /* syslog log facility + priority */
187 int (*fr_func) __P((int, ip_t *, fr_info_t *)); /* call this function */
188 char fr_icode; /* return ICMP code */
189 char fr_ifname[IFNAMSIZ];
191 char fr_oifname[IFNAMSIZ];
193 struct frdest fr_tif; /* "to" interface */
194 struct frdest fr_dif; /* duplicate packet interfaces */
197 #define fr_proto fr_ip.fi_p
198 #define fr_ttl fr_ip.fi_ttl
199 #define fr_tos fr_ip.fi_tos
200 #define fr_dst fr_ip.fi_dst
201 #define fr_src fr_ip.fi_src
202 #define fr_dmsk fr_mip.fi_dst
203 #define fr_smsk fr_mip.fi_src
206 #define offsetof(t,m) (int)((&((t *)0L)->m))
208 #define FR_CMPSIZ (sizeof(struct frentry) - offsetof(frentry_t, fr_ip))
213 #define FR_BLOCK 0x00001 /* do not allow packet to pass */
214 #define FR_PASS 0x00002 /* allow packet to pass */
215 #define FR_OUTQUE 0x00004 /* outgoing packets */
216 #define FR_INQUE 0x00008 /* ingoing packets */
217 #define FR_LOG 0x00010 /* Log */
218 #define FR_LOGB 0x00011 /* Log-fail */
219 #define FR_LOGP 0x00012 /* Log-pass */
220 #define FR_LOGBODY 0x00020 /* Log the body */
221 #define FR_LOGFIRST 0x00040 /* Log the first byte if state held */
222 #define FR_RETRST 0x00080 /* Return TCP RST packet - reset connection */
223 #define FR_RETICMP 0x00100 /* Return ICMP unreachable packet */
224 #define FR_FAKEICMP 0x00180 /* Return ICMP unreachable with fake source */
225 #define FR_NOMATCH 0x00200 /* no match occured */
226 #define FR_ACCOUNT 0x00400 /* count packet bytes */
227 #define FR_KEEPFRAG 0x00800 /* keep fragment information */
228 #define FR_KEEPSTATE 0x01000 /* keep `connection' state information */
229 #define FR_INACTIVE 0x02000
230 #define FR_QUICK 0x04000 /* match & stop processing list */
231 #define FR_FASTROUTE 0x08000 /* bypass normal routing */
232 #define FR_CALLNOW 0x10000 /* call another function (fr_func) if matches */
233 #define FR_DUP 0x20000 /* duplicate packet */
234 #define FR_LOGORBLOCK 0x40000 /* block the packet if it can't be logged */
235 #define FR_NOTSRCIP 0x80000 /* not the src IP# */
236 #define FR_NOTDSTIP 0x100000 /* not the dst IP# */
237 #define FR_AUTH 0x200000 /* use authentication */
238 #define FR_PREAUTH 0x400000 /* require preauthentication */
239 #define FR_DONTCACHE 0x800000 /* don't cache the result */
241 #define FR_LOGMASK (FR_LOG|FR_LOGP|FR_LOGB)
242 #define FR_RETMASK (FR_RETICMP|FR_RETRST|FR_FAKEICMP)
245 * These correspond to #define's for FI_* and are stored in fr_flags
247 #define FF_OPTIONS 0x01000000
248 #define FF_TCPUDP 0x02000000
249 #define FF_FRAG 0x04000000
250 #define FF_SHORT 0x08000000
252 * recognized flags for SIOCGETFF and SIOCSETFF, and get put in fr_flags
254 #define FF_LOGPASS 0x10000000
255 #define FF_LOGBLOCK 0x20000000
256 #define FF_LOGNOMATCH 0x40000000
257 #define FF_LOGGING (FF_LOGPASS|FF_LOGBLOCK|FF_LOGNOMATCH)
258 #define FF_BLOCKNONIP 0x80000000 /* Solaris2 Only */
264 #define FR_GREATERT 4
266 #define FR_GREATERTE 6
267 #define FR_OUTRANGE 7
270 typedef struct filterstats {
271 u_long fr_pass; /* packets allowed */
272 u_long fr_block; /* packets denied */
273 u_long fr_nom; /* packets which don't match any rule */
274 u_long fr_short; /* packets which are short */
275 u_long fr_ppkl; /* packets allowed and logged */
276 u_long fr_bpkl; /* packets denied and logged */
277 u_long fr_npkl; /* packets unmatched and logged */
278 u_long fr_pkl; /* packets logged */
279 u_long fr_skip; /* packets to be logged but buffer full */
280 u_long fr_ret; /* packets for which a return is sent */
281 u_long fr_acct; /* packets for which counting was performed */
282 u_long fr_bnfr; /* bad attempts to allocate fragment state */
283 u_long fr_nfr; /* new fragment state kept */
284 u_long fr_cfr; /* add new fragment state but complete pkt */
285 u_long fr_bads; /* bad attempts to allocate packet state */
286 u_long fr_ads; /* new packet state kept */
287 u_long fr_chit; /* cached hit */
288 u_long fr_tcpbad; /* TCP checksum check failures */
289 u_long fr_pull[2]; /* good and bad pullup attempts */
291 u_long fr_notdata; /* PROTO/PCPROTO that have no data */
292 u_long fr_nodata; /* mblks that have no data */
293 u_long fr_bad; /* bad IP packets to the filter */
294 u_long fr_notip; /* packets passed through no on ip queue */
295 u_long fr_drop; /* packets dropped - no info for them! */
302 typedef struct friostat {
303 struct filterstats f_st[2];
304 struct frentry *f_fin[2];
305 struct frentry *f_fout[2];
306 struct frentry *f_acctin[2];
307 struct frentry *f_acctout[2];
308 struct frentry *f_auth;
309 struct frgroup *f_groups[3][2];
311 int f_defpass; /* default pass - from fr_pass */
312 char f_active; /* 1 or 0 - active rule set */
313 char f_running; /* 1 if running, else 0 */
314 char f_logging; /* 1 if enabled, else 0 */
315 #if !SOLARIS && defined(sun)
316 char f_version[25]; /* version string */
318 char f_version[32]; /* version string */
322 typedef struct optlist {
329 * Group list structure.
331 typedef struct frgroup {
333 struct frgroup *fg_next;
334 struct frentry *fg_head;
335 struct frentry **fg_start;
340 * Log structure. Each packet header logged is prepended by one of these.
341 * Following this in the log records read from the device will be an ipflog
342 * structure which is then followed by any packet data.
344 typedef struct iplog {
350 struct iplog *ipl_next;
353 #define IPL_MAGIC 0x49504c4d /* 'IPLM' */
355 typedef struct ipflog {
356 #if (defined(NetBSD) && (NetBSD <= 1991011) && (NetBSD >= 199603)) || \
357 (defined(OpenBSD) && (OpenBSD >= 199603))
358 u_char fl_ifname[IFNAMSIZ];
363 u_char fl_plen; /* extra data after hlen */
364 u_char fl_hlen; /* length of IP headers saved */
365 u_short fl_rule; /* assume never more than 64k rules, total */
367 u_short fl_loglevel; /* syslog log level */
373 #ifndef ICMP_UNREACH_FILTER
374 # define ICMP_UNREACH_FILTER 13
378 # define IPF_LOGGING 0
380 #ifndef IPF_DEFAULT_PASS
381 # define IPF_DEFAULT_PASS FR_PASS
384 #define IPMINLEN(i, h) ((i)->ip_len >= ((i)->ip_hl * 4 + sizeof(struct h)))
385 #define IPLLOGSIZE 8192
388 * Device filenames for reading log information. Use ipf on Solaris2 because
389 * ipl is already a name used by something else.
393 # define IPL_NAME "/dev/ipf"
395 # define IPL_NAME "/dev/ipl"
398 #define IPL_NAT IPNAT_NAME
399 #define IPL_STATE IPSTATE_NAME
400 #define IPL_AUTH IPAUTH_NAME
402 #define IPL_LOGIPF 0 /* Minor device #'s for accessing logs */
404 #define IPL_LOGSTATE 2
405 #define IPL_LOGAUTH 3
408 #if !defined(CDEV_MAJOR) && defined (__FreeBSD_version) && \
409 (__FreeBSD_version >= 220000)
410 # define CDEV_MAJOR 79
414 * Post NetBSD 1.2 has the PFIL interface for packet filters. This turns
415 * on those hooks. We don't need any special mods in non-IP Filter code
418 #if (defined(NetBSD) && (NetBSD > 199609) && (NetBSD <= 1991011)) || \
419 (defined(NetBSD1_2) && NetBSD1_2 > 1)
420 # if (NetBSD >= 199905)
430 extern int fr_check __P((ip_t *, int, void *, int, mb_t **));
431 extern int (*fr_checkp) __P((ip_t *, int, void *, int, mb_t **));
432 extern int send_reset __P((ip_t *, struct ifnet *));
433 extern int icmp_error __P((ip_t *, struct ifnet *));
434 extern int ipf_log __P((void));
435 extern int ipfr_fastroute __P((ip_t *, fr_info_t *, frdest_t *));
436 extern struct ifnet *get_unit __P((char *));
437 # if defined(__NetBSD__) || defined(__OpenBSD__) || \
438 (_BSDI_VERSION >= 199701) || (__FreeBSD_version >= 300000)
439 extern int iplioctl __P((dev_t, u_long, caddr_t, int));
441 extern int iplioctl __P((dev_t, int, caddr_t, int));
443 extern int iplopen __P((dev_t, int));
444 extern int iplclose __P((dev_t, int));
445 #else /* #ifndef _KERNEL */
446 # if defined(__NetBSD__) && defined(PFIL_HOOKS)
447 extern void ipfilterattach __P((int));
449 extern int iplattach __P((void));
450 extern int ipl_enable __P((void));
451 extern int ipl_disable __P((void));
452 extern void ipflog_init __P((void));
453 extern int ipflog_clear __P((minor_t));
454 extern int ipflog_read __P((minor_t, struct uio *));
455 extern int ipflog __P((u_int, ip_t *, fr_info_t *, mb_t *));
456 extern int ipllog __P((int, fr_info_t *, void **, size_t *, int *, int));
458 extern int fr_check __P((ip_t *, int, void *, int, qif_t *, mb_t **));
459 extern int (*fr_checkp) __P((ip_t *, int, void *,
460 int, qif_t *, mb_t **));
461 extern int icmp_error __P((ip_t *, int, int, qif_t *, struct in_addr));
463 extern int iplioctl __P((dev_t, int, intptr_t, int, cred_t *, int *));
465 extern int iplioctl __P((dev_t, int, int *, int, cred_t *, int *));
467 extern int iplopen __P((dev_t *, int, int, cred_t *));
468 extern int iplclose __P((dev_t, int, int, cred_t *));
469 extern int ipfsync __P((void));
470 extern int send_reset __P((fr_info_t *, ip_t *, qif_t *));
471 extern int ipfr_fastroute __P((qif_t *, ip_t *, mblk_t *, mblk_t **,
472 fr_info_t *, frdest_t *));
473 extern void copyin_mblk __P((mblk_t *, size_t, size_t, char *));
474 extern void copyout_mblk __P((mblk_t *, size_t, size_t, char *));
475 extern int fr_qin __P((queue_t *, mblk_t *));
476 extern int fr_qout __P((queue_t *, mblk_t *));
478 extern int iplread __P((dev_t, struct uio *, cred_t *));
481 extern int fr_check __P((ip_t *, int, void *, int, mb_t **));
482 extern int (*fr_checkp) __P((ip_t *, int, void *, int, mb_t **));
484 extern int send_reset __P((tcpiphdr_t *, struct ifnet *));
486 extern int send_reset __P((fr_info_t *, struct ip *));
487 extern int send_icmp_err __P((ip_t *, int, int, void *, struct in_addr));
489 extern int ipfr_fastroute __P((mb_t *, fr_info_t *, frdest_t *));
490 extern size_t mbufchainlen __P((mb_t *));
492 # include <sys/cred.h>
493 extern int iplioctl __P((dev_t, int, caddr_t, int, cred_t *, int *));
494 extern int iplopen __P((dev_t *, int, int, cred_t *));
495 extern int iplclose __P((dev_t, int, int, cred_t *));
496 extern int iplread __P((dev_t, struct uio *, cred_t *));
497 extern int ipfsync __P((void));
498 extern int ipfilter_sgi_attach __P((void));
499 extern void ipfilter_sgi_detach __P((void));
500 extern void ipfilter_sgi_intfsync __P((void));
503 extern int iplidentify __P((char *));
505 # if (_BSDI_VERSION >= 199510) || (__FreeBSD_version >= 220000) || \
506 (NetBSD >= 199511) || defined(__OpenBSD__)
507 # if defined(__NetBSD__) || (_BSDI_VERSION >= 199701) || \
508 defined(__OpenBSD__) || (__FreeBSD_version >= 300000)
509 extern int iplioctl __P((dev_t, u_long, caddr_t, int, struct proc *));
511 extern int iplioctl __P((dev_t, int, caddr_t, int, struct proc *));
513 extern int iplopen __P((dev_t, int, int, struct proc *));
514 extern int iplclose __P((dev_t, int, int, struct proc *));
517 extern int iplopen __P((dev_t, int));
518 extern int iplclose __P((dev_t, int));
519 extern int iplioctl __P((dev_t, int, caddr_t, int));
521 extern int iplioctl(struct inode *, struct file *, u_int, u_long);
522 extern int iplopen __P((struct inode *, struct file *));
523 extern void iplclose __P((struct inode *, struct file *));
525 # endif /* (_BSDI_VERSION >= 199510) */
527 extern int iplread __P((dev_t, struct uio *, int));
530 extern int iplread __P((dev_t, struct uio *));
532 extern int iplread(struct inode *, struct file *, char *, int);
534 # endif /* BSD >= 199306 */
536 # endif /* SOLARIS */
537 #endif /* #ifndef _KERNEL */
539 extern void fixskip __P((frentry_t **, frentry_t *, int));
540 extern int countbits __P((u_32_t));
541 extern int ipldetach __P((void));
542 extern u_short fr_tcpsum __P((mb_t *, ip_t *, tcphdr_t *));
543 extern int fr_scanlist __P((u_32_t, ip_t *, fr_info_t *, void *));
544 extern u_short ipf_cksum __P((u_short *, int));
545 extern int fr_copytolog __P((int, char *, int));
546 extern void fr_forgetifp __P((void *));
547 extern int frflush __P((minor_t, int));
548 extern void frsync __P((void));
549 extern frgroup_t *fr_addgroup __P((u_int, frentry_t *, minor_t, int));
550 extern frgroup_t *fr_findgroup __P((u_int, u_32_t, minor_t, int, frgroup_t ***));
551 extern void fr_delgroup __P((u_int, u_32_t, minor_t, int));
552 extern void fr_makefrip __P((int, ip_t *, fr_info_t *));
553 extern int fr_ifpaddr __P((void *, struct in_addr *));
554 extern char *memstr __P((char *, char *, int, int));
555 extern int ipl_unreach;
556 extern int fr_running;
557 extern u_long ipl_frouteok[2];
560 extern int fr_active;
561 extern fr_info_t frcache[2];
562 extern char ipfilter_version[];
564 extern iplog_t **iplh[IPL_LOGMAX+1], *iplt[IPL_LOGMAX+1];
565 extern size_t iplused[IPL_LOGMAX + 1];
567 extern struct frentry *ipfilter[2][2], *ipacct[2][2];
568 extern struct frgroup *ipfgroups[3][2];
569 extern struct filterstats frstats[];
571 #endif /* __IP_FIL_H__ */