| 1 | /*	$NetBSD: ipf.h,v 1.3 2012/10/21 22:57:48 christos Exp $	*/ | 
| 2 |  | 
| 3 | /* | 
| 4 |  * Copyright (C) 2012 by Darren Reed. | 
| 5 |  * | 
| 6 |  * See the IPFILTER.LICENCE file for details on licencing. | 
| 7 |  * | 
| 8 |  * @(#)ipf.h	1.12 6/5/96 | 
| 9 |  * Id: ipf.h,v 1.1.1.2 2012/07/22 13:44:25 darrenr Exp $ | 
| 10 |  */ | 
| 11 |  | 
| 12 | #ifndef	__IPF_H__ | 
| 13 | #define	__IPF_H__ | 
| 14 |  | 
| 15 | #if defined(__osf__) | 
| 16 | # define radix_mask ipf_radix_mask | 
| 17 | # define radix_node ipf_radix_node | 
| 18 | # define radix_node_head ipf_radix_node_head | 
| 19 | #endif | 
| 20 |  | 
| 21 | #include <sys/param.h> | 
| 22 | #include <sys/types.h> | 
| 23 | #include <sys/file.h> | 
| 24 | /* | 
| 25 |  * This is a workaround for <sys/uio.h> troubles on FreeBSD, HPUX, OpenBSD. | 
| 26 |  * Needed here because on some systems <sys/uio.h> gets included by things | 
| 27 |  * like <sys/socket.h> | 
| 28 |  */ | 
| 29 | #ifndef _KERNEL | 
| 30 | # define ADD_KERNEL | 
| 31 | # define _KERNEL | 
| 32 | # define KERNEL | 
| 33 | #endif | 
| 34 | #ifdef __OpenBSD__ | 
| 35 | struct file; | 
| 36 | #endif | 
| 37 | #include <sys/uio.h> | 
| 38 | #ifdef ADD_KERNEL | 
| 39 | # undef _KERNEL | 
| 40 | # undef KERNEL | 
| 41 | #endif | 
| 42 | #include <sys/time.h> | 
| 43 | #include <sys/socket.h> | 
| 44 | #include <net/if.h> | 
| 45 | #if __FreeBSD_version >= 300000 | 
| 46 | # include <net/if_var.h> | 
| 47 | #endif | 
| 48 | #include <netinet/in.h> | 
| 49 | #include <netinet/in_systm.h> | 
| 50 | #include <netinet/ip.h> | 
| 51 | #include <netinet/ip_icmp.h> | 
| 52 | #ifndef	TCP_PAWS_IDLE	/* IRIX */ | 
| 53 | # include <netinet/tcp.h> | 
| 54 | #endif | 
| 55 | #include <netinet/udp.h> | 
| 56 |  | 
| 57 | #include <arpa/inet.h> | 
| 58 |  | 
| 59 | #include <errno.h> | 
| 60 | #include <limits.h> | 
| 61 | #include <netdb.h> | 
| 62 | #include <stdlib.h> | 
| 63 | #include <stddef.h> | 
| 64 | #include <stdio.h> | 
| 65 | #if !defined(__SVR4) && !defined(__svr4__) && defined(sun) | 
| 66 | # include <strings.h> | 
| 67 | #endif | 
| 68 | #include <string.h> | 
| 69 | #include <unistd.h> | 
| 70 |  | 
| 71 | #include "netinet/ip_compat.h" | 
| 72 | #include "netinet/ip_fil.h" | 
| 73 | #include "netinet/ip_nat.h" | 
| 74 | #include "netinet/ip_frag.h" | 
| 75 | #include "netinet/ip_state.h" | 
| 76 | #include "netinet/ip_proxy.h" | 
| 77 | #include "netinet/ip_auth.h" | 
| 78 | #include "netinet/ip_lookup.h" | 
| 79 | #include "netinet/ip_pool.h" | 
| 80 | #include "netinet/ip_scan.h" | 
| 81 | #include "netinet/ip_htable.h" | 
| 82 | #include "netinet/ip_sync.h" | 
| 83 | #include "netinet/ip_dstlist.h" | 
| 84 |  | 
| 85 | #include "opts.h" | 
| 86 |  | 
| 87 | #ifndef __P | 
| 88 | # ifdef __STDC__ | 
| 89 | #  define	__P(x)	x | 
| 90 | # else | 
| 91 | #  define	__P(x)	() | 
| 92 | # endif | 
| 93 | #endif | 
| 94 | #ifndef __STDC__ | 
| 95 | # undef		const | 
| 96 | # define	const | 
| 97 | #endif | 
| 98 |  | 
| 99 | #ifndef	U_32_T | 
| 100 | # define	U_32_T	1 | 
| 101 | # if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__) || \ | 
| 102 |     defined(__sgi) | 
| 103 | typedef	u_int32_t	u_32_t; | 
| 104 | # else | 
| 105 | #  if defined(__alpha__) || defined(__alpha) || defined(_LP64) | 
| 106 | typedef unsigned int	u_32_t; | 
| 107 | #  else | 
| 108 | #   if SOLARIS2 >= 6 | 
| 109 | typedef uint32_t	u_32_t; | 
| 110 | #   else | 
| 111 | typedef unsigned int	u_32_t; | 
| 112 | #   endif | 
| 113 | #  endif | 
| 114 | # endif /* __NetBSD__ || __OpenBSD__ || __FreeBSD__ || __sgi */ | 
| 115 | #endif /* U_32_T */ | 
| 116 |  | 
| 117 | #ifndef	MAXHOSTNAMELEN | 
| 118 | # define	MAXHOSTNAMELEN	256 | 
| 119 | #endif | 
| 120 |  | 
| 121 | #define	MAX_ICMPCODE	16 | 
| 122 | #define	MAX_ICMPTYPE	19 | 
| 123 |  | 
| 124 | #define	PRINTF	(void)printf | 
| 125 | #define	FPRINTF	(void)fprintf | 
| 126 |  | 
| 127 |  | 
| 128 | struct	ipopt_names	{ | 
| 129 | 	int	on_value; | 
| 130 | 	int	on_bit; | 
| 131 | 	int	on_siz; | 
| 132 | 	char	*on_name; | 
| 133 | }; | 
| 134 |  | 
| 135 |  | 
| 136 | typedef struct  alist_s { | 
| 137 | 	struct	alist_s	*al_next; | 
| 138 | 	int		al_not; | 
| 139 | 	int		al_family; | 
| 140 | 	i6addr_t	al_i6addr; | 
| 141 | 	i6addr_t	al_i6mask; | 
| 142 | } alist_t; | 
| 143 |  | 
| 144 | #define	al_addr	al_i6addr.in4_addr | 
| 145 | #define	al_mask	al_i6mask.in4_addr | 
| 146 | #define	al_1	al_addr | 
| 147 | #define	al_2	al_mask | 
| 148 |  | 
| 149 |  | 
| 150 | typedef struct  plist_s { | 
| 151 | 	struct	plist_s	*pl_next; | 
| 152 | 	int		pl_compare; | 
| 153 | 	u_short		pl_port1; | 
| 154 | 	u_short		pl_port2; | 
| 155 | } plist_t; | 
| 156 |  | 
| 157 |  | 
| 158 | typedef	struct	{ | 
| 159 | 	u_short	fb_c; | 
| 160 | 	u_char	fb_t; | 
| 161 | 	u_char	fb_f; | 
| 162 | 	u_32_t	fb_k; | 
| 163 | } fakebpf_t; | 
| 164 |  | 
| 165 |  | 
| 166 | typedef struct  { | 
| 167 | 	char	*it_name; | 
| 168 | 	int	it_v4; | 
| 169 | 	int	it_v6; | 
| 170 | } icmptype_t; | 
| 171 |  | 
| 172 |  | 
| 173 | typedef	struct	wordtab { | 
| 174 | 	char	*w_word; | 
| 175 | 	int	w_value; | 
| 176 | } wordtab_t; | 
| 177 |  | 
| 178 |  | 
| 179 | typedef	struct	namelist { | 
| 180 | 	struct namelist	*na_next; | 
| 181 | 	char		*na_name; | 
| 182 | 	int		na_value; | 
| 183 | } namelist_t; | 
| 184 |  | 
| 185 |  | 
| 186 | typedef	struct	proxyrule { | 
| 187 | 	struct	proxyrule	*pr_next; | 
| 188 | 	char			*pr_proxy; | 
| 189 | 	char			*pr_conf; | 
| 190 | 	namelist_t		*pr_names; | 
| 191 | 	int			pr_proto; | 
| 192 | } proxyrule_t; | 
| 193 |  | 
| 194 |  | 
| 195 | #if defined(__NetBSD__) || defined(__OpenBSD__) || \ | 
| 196 |         (_BSDI_VERSION >= 199701) || (__FreeBSD_version >= 300000) || \ | 
| 197 | 	SOLARIS || defined(__sgi) || defined(__osf__) || defined(linux) | 
| 198 | # include <stdarg.h> | 
| 199 | typedef	int	(* ioctlfunc_t) __P((int, ioctlcmd_t, ...)); | 
| 200 | #else | 
| 201 | typedef	int	(* ioctlfunc_t) __P((dev_t, ioctlcmd_t, void *)); | 
| 202 | #endif | 
| 203 | typedef	int	(* addfunc_t) __P((int, ioctlfunc_t, void *)); | 
| 204 | typedef	int	(* copyfunc_t) __P((void *, void *, size_t)); | 
| 205 |  | 
| 206 |  | 
| 207 | /* | 
| 208 |  * SunOS4 | 
| 209 |  */ | 
| 210 | #if defined(sun) && !defined(__SVR4) && !defined(__svr4__) | 
| 211 | extern	int	ioctl __P((int, int, void *)); | 
| 212 | #endif | 
| 213 |  | 
| 214 | extern	char	thishost[]; | 
| 215 | extern	char	flagset[]; | 
| 216 | extern	u_char	flags[]; | 
| 217 | extern	struct ipopt_names ionames[]; | 
| 218 | extern	struct ipopt_names secclass[]; | 
| 219 | extern	char	*icmpcodes[MAX_ICMPCODE + 1]; | 
| 220 | extern	char	*icmptypes[MAX_ICMPTYPE + 1]; | 
| 221 | extern	int	use_inet6; | 
| 222 | extern	int	lineNum; | 
| 223 | extern	int	debuglevel; | 
| 224 | extern	struct ipopt_names v6ionames[]; | 
| 225 | extern	icmptype_t icmptypelist[]; | 
| 226 | extern	wordtab_t statefields[]; | 
| 227 | extern	wordtab_t natfields[]; | 
| 228 | extern	wordtab_t poolfields[]; | 
| 229 |  | 
| 230 |  | 
| 231 | extern int addicmp __P((char ***, struct frentry *, int)); | 
| 232 | extern int addipopt __P((char *, struct ipopt_names *, int, char *)); | 
| 233 | extern int addkeep __P((char ***, struct frentry *, int)); | 
| 234 | extern alist_t *alist_new __P((int, char *)); | 
| 235 | extern void alist_free __P((alist_t *)); | 
| 236 | extern void assigndefined __P((char *)); | 
| 237 | extern void binprint __P((void *, size_t)); | 
| 238 | extern u_32_t buildopts __P((char *, char *, int)); | 
| 239 | extern int checkrev __P((char *)); | 
| 240 | extern int connecttcp __P((char *, int)); | 
| 241 | extern int count6bits __P((u_32_t *)); | 
| 242 | extern int count4bits __P((u_32_t)); | 
| 243 | extern char *fac_toname __P((int)); | 
| 244 | extern int fac_findname __P((char *)); | 
| 245 | extern const char *familyname __P((const int)); | 
| 246 | extern void fill6bits __P((int, u_int *)); | 
| 247 | extern wordtab_t *findword __P((wordtab_t *, char *)); | 
| 248 | extern int ftov __P((int)); | 
| 249 | extern char *ipf_geterror __P((int, ioctlfunc_t *)); | 
| 250 | extern int genmask __P((int, char *, i6addr_t *)); | 
| 251 | extern int gethost __P((int, char *, i6addr_t *)); | 
| 252 | extern int geticmptype __P((int, char *)); | 
| 253 | extern int getport __P((struct frentry *, char *, u_short *, char *)); | 
| 254 | extern int getportproto __P((char *, int)); | 
| 255 | extern int getproto __P((char *)); | 
| 256 | extern char *getnattype __P((struct nat *)); | 
| 257 | extern char *getsumd __P((u_32_t)); | 
| 258 | extern u_32_t getoptbyname __P((char *)); | 
| 259 | extern u_32_t getoptbyvalue __P((int)); | 
| 260 | extern u_32_t getv6optbyname __P((char *)); | 
| 261 | extern u_32_t getv6optbyvalue __P((int)); | 
| 262 | extern char *icmptypename __P((int, int)); | 
| 263 | extern void initparse __P((void)); | 
| 264 | extern void ipf_dotuning __P((int, char *, ioctlfunc_t)); | 
| 265 | extern int ipf_addrule __P((int, ioctlfunc_t, void *)); | 
| 266 | extern void ipf_mutex_clean __P((void)); | 
| 267 | extern int ipf_parsefile __P((int, addfunc_t, ioctlfunc_t *, char *)); | 
| 268 | extern int ipf_parsesome __P((int, addfunc_t, ioctlfunc_t *, FILE *)); | 
| 269 | extern void ipf_perror __P((int, char *)); | 
| 270 | extern int ipf_perror_fd __P(( int, ioctlfunc_t, char *)); | 
| 271 | extern void ipf_rwlock_clean __P((void)); | 
| 272 | extern char *ipf_strerror __P((int)); | 
| 273 | extern void ipferror __P((int, char *)); | 
| 274 | extern int ipmon_parsefile __P((char *)); | 
| 275 | extern int ipmon_parsesome __P((FILE *)); | 
| 276 | extern int ipnat_addrule __P((int, ioctlfunc_t, void *)); | 
| 277 | extern int ipnat_parsefile __P((int, addfunc_t, ioctlfunc_t, char *)); | 
| 278 | extern int ipnat_parsesome __P((int, addfunc_t, ioctlfunc_t, FILE *)); | 
| 279 | extern int ippool_parsefile __P((int, char *, ioctlfunc_t)); | 
| 280 | extern int ippool_parsesome __P((int, FILE *, ioctlfunc_t)); | 
| 281 | extern int kmemcpywrap __P((void *, void *, size_t)); | 
| 282 | extern char *kvatoname __P((ipfunc_t, ioctlfunc_t)); | 
| 283 | extern int load_dstlist __P((struct ippool_dst *, ioctlfunc_t, | 
| 284 | 			     ipf_dstnode_t *)); | 
| 285 | extern int load_dstlistnode __P((int, char *, struct ipf_dstnode *, | 
| 286 | 				 ioctlfunc_t)); | 
| 287 | extern alist_t *load_file __P((char *)); | 
| 288 | extern int load_hash __P((struct iphtable_s *, struct iphtent_s *, | 
| 289 | 			  ioctlfunc_t)); | 
| 290 | extern int load_hashnode __P((int, char *, struct iphtent_s *, int, | 
| 291 | 			      ioctlfunc_t)); | 
| 292 | extern alist_t *load_http __P((char *)); | 
| 293 | extern int load_pool __P((struct ip_pool_s *list, ioctlfunc_t)); | 
| 294 | extern int load_poolnode __P((int, char *, ip_pool_node_t *, int, ioctlfunc_t)); | 
| 295 | extern alist_t *load_url __P((char *)); | 
| 296 | extern alist_t *make_range __P((int, struct in_addr, struct in_addr)); | 
| 297 | extern void mb_hexdump __P((mb_t *, FILE *)); | 
| 298 | extern ipfunc_t nametokva __P((char *, ioctlfunc_t)); | 
| 299 | extern void nat_setgroupmap __P((struct ipnat *)); | 
| 300 | extern int ntomask __P((int, int, u_32_t *)); | 
| 301 | extern u_32_t optname __P((char ***, u_short *, int)); | 
| 302 | extern wordtab_t *parsefields __P((wordtab_t *, char *)); | 
| 303 | extern int *parseipfexpr __P((char *, char **)); | 
| 304 | extern int parsewhoisline __P((char *, addrfamily_t *, addrfamily_t *)); | 
| 305 | extern void pool_close __P((void)); | 
| 306 | extern int pool_fd __P((void)); | 
| 307 | extern int pool_ioctl __P((ioctlfunc_t, ioctlcmd_t, void *)); | 
| 308 | extern int pool_open __P((void)); | 
| 309 | extern char *portname __P((int, int)); | 
| 310 | extern int pri_findname __P((char *)); | 
| 311 | extern char *pri_toname __P((int)); | 
| 312 | extern void print_toif __P((int, char *, char *, struct frdest *)); | 
| 313 | extern void printaps __P((ap_session_t *, int, int)); | 
| 314 | extern void printaddr __P((int, int, char *, int, u_32_t *, u_32_t *)); | 
| 315 | extern void printbuf __P((char *, int, int)); | 
| 316 | extern void printfieldhdr __P((wordtab_t *, wordtab_t *)); | 
| 317 | extern void printfr __P((struct frentry *, ioctlfunc_t)); | 
| 318 | extern struct iphtable_s *printhash __P((struct iphtable_s *, copyfunc_t, | 
| 319 | 					 char *, int, wordtab_t *)); | 
| 320 | extern struct iphtable_s *printhash_live __P((iphtable_t *, int, char *, | 
| 321 | 					      int, wordtab_t *)); | 
| 322 | extern ippool_dst_t *printdstl_live __P((ippool_dst_t *, int, char *, | 
| 323 | 					 int, wordtab_t *)); | 
| 324 | extern void printhashdata __P((iphtable_t *, int)); | 
| 325 | extern struct iphtent_s *printhashnode __P((struct iphtable_s *, | 
| 326 | 					    struct iphtent_s *, | 
| 327 | 					    copyfunc_t, int, wordtab_t *)); | 
| 328 | extern void printhost __P((int, u_32_t *)); | 
| 329 | extern void printhostmask __P((int, u_32_t *, u_32_t *)); | 
| 330 | extern void printip __P((int, u_32_t *)); | 
| 331 | extern void printlog __P((struct frentry *)); | 
| 332 | extern void printlookup __P((char *, i6addr_t *addr, i6addr_t *mask)); | 
| 333 | extern void printmask __P((int, u_32_t *)); | 
| 334 | extern void printnataddr __P((int, char *, nat_addr_t *, int)); | 
| 335 | extern void printnatfield __P((nat_t *, int)); | 
| 336 | extern void printnatside __P((char *, nat_stat_side_t *)); | 
| 337 | extern void printpacket __P((int, mb_t *)); | 
| 338 | extern void printpacket6 __P((int, mb_t *)); | 
| 339 | extern struct ippool_dst *printdstlist __P((struct ippool_dst *, copyfunc_t, | 
| 340 | 					    char *, int, ipf_dstnode_t *, | 
| 341 | 					    wordtab_t *)); | 
| 342 | extern void printdstlistdata __P((ippool_dst_t *, int)); | 
| 343 | extern ipf_dstnode_t *printdstlistnode __P((ipf_dstnode_t *, copyfunc_t, | 
| 344 | 					    int, wordtab_t *)); | 
| 345 | extern void printdstlistpolicy __P((ippool_policy_t)); | 
| 346 | extern struct ip_pool_s *printpool __P((struct ip_pool_s *, copyfunc_t, | 
| 347 | 					char *, int, wordtab_t *)); | 
| 348 | extern struct ip_pool_s *printpool_live __P((struct ip_pool_s *, int, | 
| 349 | 					     char *, int, wordtab_t *)); | 
| 350 | extern void printpooldata __P((ip_pool_t *, int)); | 
| 351 | extern void printpoolfield __P((void *, int, int)); | 
| 352 | extern struct ip_pool_node *printpoolnode __P((struct ip_pool_node *, | 
| 353 | 					       int, wordtab_t *)); | 
| 354 | extern void printproto __P((struct protoent *, int, struct ipnat *)); | 
| 355 | extern void printportcmp __P((int, struct frpcmp *)); | 
| 356 | extern void printstatefield __P((ipstate_t *, int)); | 
| 357 | extern void printtqtable __P((ipftq_t *)); | 
| 358 | extern void printtunable __P((ipftune_t *)); | 
| 359 | extern void printunit __P((int)); | 
| 360 | extern void optprint __P((u_short *, u_long, u_long)); | 
| 361 | #ifdef	USE_INET6 | 
| 362 | extern void optprintv6 __P((u_short *, u_long, u_long)); | 
| 363 | #endif | 
| 364 | extern int remove_hash __P((struct iphtable_s *, ioctlfunc_t)); | 
| 365 | extern int remove_hashnode __P((int, char *, struct iphtent_s *, ioctlfunc_t)); | 
| 366 | extern int remove_pool __P((ip_pool_t *, ioctlfunc_t)); | 
| 367 | extern int remove_poolnode __P((int, char *, ip_pool_node_t *, ioctlfunc_t)); | 
| 368 | extern u_char tcpflags __P((char *)); | 
| 369 | extern void printc __P((struct frentry *)); | 
| 370 | extern void printC __P((int)); | 
| 371 | extern void emit __P((int, int, void *, struct frentry *)); | 
| 372 | extern u_char secbit __P((int)); | 
| 373 | extern u_char seclevel __P((char *)); | 
| 374 | extern void printfraginfo __P((char *, struct ipfr *)); | 
| 375 | extern void printifname __P((char *, char *, void *)); | 
| 376 | extern char *hostname __P((int, const void *)); | 
| 377 | extern struct ipstate *printstate __P((struct ipstate *, int, u_long)); | 
| 378 | extern void printsbuf __P((char *)); | 
| 379 | extern void printnat __P((struct ipnat *, int)); | 
| 380 | extern void printactiveaddress __P((int, char *, i6addr_t *, char *)); | 
| 381 | extern void printactivenat __P((struct nat *, int, u_long)); | 
| 382 | extern void printhostmap __P((struct hostmap *, u_int)); | 
| 383 | extern void printtcpflags __P((u_32_t, u_32_t)); | 
| 384 | extern void printipfexpr __P((int *)); | 
| 385 | extern void printstatefield __P((ipstate_t *, int)); | 
| 386 | extern void printstatefieldhdr __P((int)); | 
| 387 | extern int sendtrap_v1_0 __P((int, char *, char *, int, time_t)); | 
| 388 | extern int sendtrap_v2_0 __P((int, char *, char *, int)); | 
| 389 | extern int vtof __P((int)); | 
| 390 |  | 
| 391 | extern void set_variable __P((char *, char *)); | 
| 392 | extern char *get_variable __P((char *, char **, int)); | 
| 393 | extern void resetlexer __P((void)); | 
| 394 |  | 
| 395 | extern void debug __P((int, char *, ...)); | 
| 396 | extern void verbose __P((int, char *, ...)); | 
| 397 | extern void ipfkdebug __P((char *, ...)); | 
| 398 | extern void ipfkverbose __P((char *, ...)); | 
| 399 |  | 
| 400 | #if SOLARIS | 
| 401 | extern int gethostname __P((char *, int )); | 
| 402 | extern void sync __P((void)); | 
| 403 | #endif | 
| 404 |  | 
| 405 | #endif /* __IPF_H__ */ | 
| 406 |  |