ipf.h revision 255332
1145519Sdarrenr/* $FreeBSD: head/contrib/ipfilter/ipf.h 255332 2013-09-06 23:11:19Z cy $ */ 2145510Sdarrenr 322514Sdarrenr/* 4255332Scy * Copyright (C) 2012 by Darren Reed. 522514Sdarrenr * 680486Sdarrenr * See the IPFILTER.LICENCE file for details on licencing. 722514Sdarrenr * 822514Sdarrenr * @(#)ipf.h 1.12 6/5/96 9255332Scy * $Id$ 1022514Sdarrenr */ 1122514Sdarrenr 1226119Sdarrenr#ifndef __IPF_H__ 1326119Sdarrenr#define __IPF_H__ 1426119Sdarrenr 15145510Sdarrenr#if defined(__osf__) 16145510Sdarrenr# define radix_mask ipf_radix_mask 17145510Sdarrenr# define radix_node ipf_radix_node 18145510Sdarrenr# define radix_node_head ipf_radix_node_head 1922514Sdarrenr#endif 2022514Sdarrenr 21145510Sdarrenr#include <sys/param.h> 22145510Sdarrenr#include <sys/types.h> 23145510Sdarrenr#include <sys/file.h> 24145510Sdarrenr/* 25145510Sdarrenr * This is a workaround for <sys/uio.h> troubles on FreeBSD, HPUX, OpenBSD. 26145510Sdarrenr * Needed here because on some systems <sys/uio.h> gets included by things 27145510Sdarrenr * like <sys/socket.h> 28145510Sdarrenr */ 29145510Sdarrenr#ifndef _KERNEL 30145510Sdarrenr# define ADD_KERNEL 31145510Sdarrenr# define _KERNEL 32145510Sdarrenr# define KERNEL 33145510Sdarrenr#endif 34145510Sdarrenr#ifdef __OpenBSD__ 35145510Sdarrenrstruct file; 36145510Sdarrenr#endif 37145510Sdarrenr#include <sys/uio.h> 38145510Sdarrenr#ifdef ADD_KERNEL 39145510Sdarrenr# undef _KERNEL 40145510Sdarrenr# undef KERNEL 41145510Sdarrenr#endif 42145510Sdarrenr#include <sys/time.h> 43145510Sdarrenr#include <sys/socket.h> 44145510Sdarrenr#include <net/if.h> 45145510Sdarrenr#if __FreeBSD_version >= 300000 46145510Sdarrenr# include <net/if_var.h> 47145510Sdarrenr#endif 48145510Sdarrenr#include <netinet/in.h> 49145510Sdarrenr#include <netinet/in_systm.h> 50145510Sdarrenr#include <netinet/ip.h> 51145510Sdarrenr#include <netinet/ip_icmp.h> 52145510Sdarrenr#ifndef TCP_PAWS_IDLE /* IRIX */ 53145510Sdarrenr# include <netinet/tcp.h> 54145510Sdarrenr#endif 55145510Sdarrenr#include <netinet/udp.h> 5660841Sdarrenr 57145510Sdarrenr#include <arpa/inet.h> 5860841Sdarrenr 59145510Sdarrenr#include <errno.h> 60145510Sdarrenr#include <limits.h> 61145510Sdarrenr#include <netdb.h> 62145510Sdarrenr#include <stdlib.h> 63145510Sdarrenr#include <stddef.h> 64145510Sdarrenr#include <stdio.h> 65145510Sdarrenr#if !defined(__SVR4) && !defined(__svr4__) && defined(sun) 66145510Sdarrenr# include <strings.h> 67145510Sdarrenr#endif 68145510Sdarrenr#include <string.h> 69145510Sdarrenr#include <unistd.h> 70145510Sdarrenr 71145510Sdarrenr#include "netinet/ip_compat.h" 72145510Sdarrenr#include "netinet/ip_fil.h" 73145510Sdarrenr#include "netinet/ip_nat.h" 74145510Sdarrenr#include "netinet/ip_frag.h" 75145510Sdarrenr#include "netinet/ip_state.h" 76145510Sdarrenr#include "netinet/ip_proxy.h" 77145510Sdarrenr#include "netinet/ip_auth.h" 78145510Sdarrenr#include "netinet/ip_lookup.h" 79145510Sdarrenr#include "netinet/ip_pool.h" 80145510Sdarrenr#include "netinet/ip_scan.h" 81145510Sdarrenr#include "netinet/ip_htable.h" 82145510Sdarrenr#include "netinet/ip_sync.h" 83255332Scy#include "netinet/ip_dstlist.h" 84145510Sdarrenr 85145510Sdarrenr#include "opts.h" 86145510Sdarrenr 8724583Sdarrenr#ifndef __P 88145510Sdarrenr# ifdef __STDC__ 8924583Sdarrenr# define __P(x) x 9024583Sdarrenr# else 9124583Sdarrenr# define __P(x) () 9224583Sdarrenr# endif 9324583Sdarrenr#endif 94145510Sdarrenr#ifndef __STDC__ 95145510Sdarrenr# undef const 96145510Sdarrenr# define const 97145510Sdarrenr#endif 9822514Sdarrenr 99145510Sdarrenr#ifndef U_32_T 100145510Sdarrenr# define U_32_T 1 101145510Sdarrenr# if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__) || \ 102145510Sdarrenr defined(__sgi) 103145510Sdarrenrtypedef u_int32_t u_32_t; 104145510Sdarrenr# else 105145510Sdarrenr# if defined(__alpha__) || defined(__alpha) || defined(_LP64) 106145510Sdarrenrtypedef unsigned int u_32_t; 107145510Sdarrenr# else 108145510Sdarrenr# if SOLARIS2 >= 6 109145510Sdarrenrtypedef uint32_t u_32_t; 110145510Sdarrenr# else 111145510Sdarrenrtypedef unsigned int u_32_t; 112145510Sdarrenr# endif 113145510Sdarrenr# endif 114145510Sdarrenr# endif /* __NetBSD__ || __OpenBSD__ || __FreeBSD__ || __sgi */ 115145510Sdarrenr#endif /* U_32_T */ 11660841Sdarrenr 117145510Sdarrenr#ifndef MAXHOSTNAMELEN 118145510Sdarrenr# define MAXHOSTNAMELEN 256 11931183Speter#endif 12031183Speter 121145510Sdarrenr#define MAX_ICMPCODE 16 122145510Sdarrenr#define MAX_ICMPTYPE 19 12322514Sdarrenr 124255332Scy#define PRINTF (void)printf 125255332Scy#define FPRINTF (void)fprintf 12624583Sdarrenr 127255332Scy 12822514Sdarrenrstruct ipopt_names { 12922514Sdarrenr int on_value; 13022514Sdarrenr int on_bit; 13122514Sdarrenr int on_siz; 13222514Sdarrenr char *on_name; 13322514Sdarrenr}; 13422514Sdarrenr 13522514Sdarrenr 136145510Sdarrenrtypedef struct alist_s { 137145510Sdarrenr struct alist_s *al_next; 138145510Sdarrenr int al_not; 139255332Scy int al_family; 140145510Sdarrenr i6addr_t al_i6addr; 141145510Sdarrenr i6addr_t al_i6mask; 142145510Sdarrenr} alist_t; 143145510Sdarrenr 144145510Sdarrenr#define al_addr al_i6addr.in4_addr 145145510Sdarrenr#define al_mask al_i6mask.in4_addr 146145510Sdarrenr#define al_1 al_addr 147145510Sdarrenr#define al_2 al_mask 148145510Sdarrenr 149145510Sdarrenr 150255332Scytypedef struct plist_s { 151255332Scy struct plist_s *pl_next; 152255332Scy int pl_compare; 153255332Scy u_short pl_port1; 154255332Scy u_short pl_port2; 155255332Scy} plist_t; 156255332Scy 157255332Scy 158145510Sdarrenrtypedef struct { 159145510Sdarrenr u_short fb_c; 160145510Sdarrenr u_char fb_t; 161145510Sdarrenr u_char fb_f; 162145510Sdarrenr u_32_t fb_k; 163145510Sdarrenr} fakebpf_t; 164145510Sdarrenr 165145510Sdarrenr 166255332Scytypedef struct { 167255332Scy char *it_name; 168255332Scy int it_v4; 169255332Scy int it_v6; 170255332Scy} icmptype_t; 171255332Scy 172255332Scy 173255332Scytypedef struct wordtab { 174255332Scy char *w_word; 175255332Scy int w_value; 176255332Scy} wordtab_t; 177255332Scy 178255332Scy 179255332Scytypedef struct namelist { 180255332Scy struct namelist *na_next; 181255332Scy char *na_name; 182255332Scy int na_value; 183255332Scy} namelist_t; 184255332Scy 185255332Scy 186255332Scytypedef struct proxyrule { 187255332Scy struct proxyrule *pr_next; 188255332Scy char *pr_proxy; 189255332Scy char *pr_conf; 190255332Scy namelist_t *pr_names; 191255332Scy int pr_proto; 192255332Scy} proxyrule_t; 193255332Scy 194255332Scy 195145510Sdarrenr#if defined(__NetBSD__) || defined(__OpenBSD__) || \ 196145510Sdarrenr (_BSDI_VERSION >= 199701) || (__FreeBSD_version >= 300000) || \ 197145510Sdarrenr SOLARIS || defined(__sgi) || defined(__osf__) || defined(linux) 198145510Sdarrenr# include <stdarg.h> 199145510Sdarrenrtypedef int (* ioctlfunc_t) __P((int, ioctlcmd_t, ...)); 200145510Sdarrenr#else 201145510Sdarrenrtypedef int (* ioctlfunc_t) __P((dev_t, ioctlcmd_t, void *)); 202145510Sdarrenr#endif 203255332Scytypedef int (* addfunc_t) __P((int, ioctlfunc_t, void *)); 204145510Sdarrenrtypedef int (* copyfunc_t) __P((void *, void *, size_t)); 205145510Sdarrenr 206145510Sdarrenr 207145510Sdarrenr/* 208145510Sdarrenr * SunOS4 209145510Sdarrenr */ 210145510Sdarrenr#if defined(sun) && !defined(__SVR4) && !defined(__svr4__) 211145510Sdarrenrextern int ioctl __P((int, int, void *)); 212145510Sdarrenr#endif 213145510Sdarrenr 214145510Sdarrenrextern char thishost[]; 21560841Sdarrenrextern char flagset[]; 21660841Sdarrenrextern u_char flags[]; 217145510Sdarrenrextern struct ipopt_names ionames[]; 218145510Sdarrenrextern struct ipopt_names secclass[]; 219145510Sdarrenrextern char *icmpcodes[MAX_ICMPCODE + 1]; 220145510Sdarrenrextern char *icmptypes[MAX_ICMPTYPE + 1]; 221145510Sdarrenrextern int use_inet6; 222145510Sdarrenrextern int lineNum; 223255332Scyextern int debuglevel; 224145510Sdarrenrextern struct ipopt_names v6ionames[]; 225255332Scyextern icmptype_t icmptypelist[]; 226255332Scyextern wordtab_t statefields[]; 227255332Scyextern wordtab_t natfields[]; 228255332Scyextern wordtab_t poolfields[]; 22960841Sdarrenr 23092686Sdarrenr 231145510Sdarrenrextern int addicmp __P((char ***, struct frentry *, int)); 232145510Sdarrenrextern int addipopt __P((char *, struct ipopt_names *, int, char *)); 233255332Scyextern int addkeep __P((char ***, struct frentry *, int)); 234255332Scyextern alist_t *alist_new __P((int, char *)); 235170268Sdarrenrextern void alist_free __P((alist_t *)); 236255332Scyextern void assigndefined __P((char *)); 237145510Sdarrenrextern void binprint __P((void *, size_t)); 238145510Sdarrenrextern u_32_t buildopts __P((char *, char *, int)); 239145510Sdarrenrextern int checkrev __P((char *)); 240255332Scyextern int connecttcp __P((char *, int)); 241145510Sdarrenrextern int count6bits __P((u_32_t *)); 242145510Sdarrenrextern int count4bits __P((u_32_t)); 243145510Sdarrenrextern char *fac_toname __P((int)); 244145510Sdarrenrextern int fac_findname __P((char *)); 245255332Scyextern const char *familyname __P((const int)); 246145510Sdarrenrextern void fill6bits __P((int, u_int *)); 247255332Scyextern wordtab_t *findword __P((wordtab_t *, char *)); 248255332Scyextern int ftov __P((int)); 249255332Scyextern char *ipf_geterror __P((int, ioctlfunc_t *)); 250255332Scyextern int genmask __P((int, char *, i6addr_t *)); 251255332Scyextern int gethost __P((int, char *, i6addr_t *)); 252255332Scyextern int geticmptype __P((int, char *)); 253255332Scyextern int getport __P((struct frentry *, char *, u_short *, char *)); 254145510Sdarrenrextern int getportproto __P((char *, int)); 255145510Sdarrenrextern int getproto __P((char *)); 256255332Scyextern char *getnattype __P((struct nat *)); 257145510Sdarrenrextern char *getsumd __P((u_32_t)); 258145510Sdarrenrextern u_32_t getoptbyname __P((char *)); 259145510Sdarrenrextern u_32_t getoptbyvalue __P((int)); 260145510Sdarrenrextern u_32_t getv6optbyname __P((char *)); 261145510Sdarrenrextern u_32_t getv6optbyvalue __P((int)); 262255332Scyextern char *icmptypename __P((int, int)); 263145510Sdarrenrextern void initparse __P((void)); 264255332Scyextern void ipf_dotuning __P((int, char *, ioctlfunc_t)); 265255332Scyextern int ipf_addrule __P((int, ioctlfunc_t, void *)); 266255332Scyextern void ipf_mutex_clean __P((void)); 267145510Sdarrenrextern int ipf_parsefile __P((int, addfunc_t, ioctlfunc_t *, char *)); 268145510Sdarrenrextern int ipf_parsesome __P((int, addfunc_t, ioctlfunc_t *, FILE *)); 269255332Scyextern void ipf_perror __P((int, char *)); 270255332Scyextern int ipf_perror_fd __P(( int, ioctlfunc_t, char *)); 271255332Scyextern void ipf_rwlock_clean __P((void)); 272255332Scyextern char *ipf_strerror __P((int)); 273255332Scyextern void ipferror __P((int, char *)); 274145510Sdarrenrextern int ipmon_parsefile __P((char *)); 275145510Sdarrenrextern int ipmon_parsesome __P((FILE *)); 276255332Scyextern int ipnat_addrule __P((int, ioctlfunc_t, void *)); 277145510Sdarrenrextern int ipnat_parsefile __P((int, addfunc_t, ioctlfunc_t, char *)); 278145510Sdarrenrextern int ipnat_parsesome __P((int, addfunc_t, ioctlfunc_t, FILE *)); 279145510Sdarrenrextern int ippool_parsefile __P((int, char *, ioctlfunc_t)); 280145510Sdarrenrextern int ippool_parsesome __P((int, FILE *, ioctlfunc_t)); 281145510Sdarrenrextern int kmemcpywrap __P((void *, void *, size_t)); 282145510Sdarrenrextern char *kvatoname __P((ipfunc_t, ioctlfunc_t)); 283255332Scyextern int load_dstlist __P((struct ippool_dst *, ioctlfunc_t, 284255332Scy ipf_dstnode_t *)); 285255332Scyextern int load_dstlistnode __P((int, char *, struct ipf_dstnode *, 286255332Scy ioctlfunc_t)); 287170268Sdarrenrextern alist_t *load_file __P((char *)); 288145510Sdarrenrextern int load_hash __P((struct iphtable_s *, struct iphtent_s *, 289145510Sdarrenr ioctlfunc_t)); 290255332Scyextern int load_hashnode __P((int, char *, struct iphtent_s *, int, 291255332Scy ioctlfunc_t)); 292170268Sdarrenrextern alist_t *load_http __P((char *)); 293145510Sdarrenrextern int load_pool __P((struct ip_pool_s *list, ioctlfunc_t)); 294255332Scyextern int load_poolnode __P((int, char *, ip_pool_node_t *, int, ioctlfunc_t)); 295170268Sdarrenrextern alist_t *load_url __P((char *)); 296145510Sdarrenrextern alist_t *make_range __P((int, struct in_addr, struct in_addr)); 297255332Scyextern void mb_hexdump __P((mb_t *, FILE *)); 298145510Sdarrenrextern ipfunc_t nametokva __P((char *, ioctlfunc_t)); 299145510Sdarrenrextern void nat_setgroupmap __P((struct ipnat *)); 300145510Sdarrenrextern int ntomask __P((int, int, u_32_t *)); 301145510Sdarrenrextern u_32_t optname __P((char ***, u_short *, int)); 302255332Scyextern wordtab_t *parsefields __P((wordtab_t *, char *)); 303255332Scyextern int *parseipfexpr __P((char *, char **)); 304255332Scyextern int parsewhoisline __P((char *, addrfamily_t *, addrfamily_t *)); 305255332Scyextern void pool_close __P((void)); 306255332Scyextern int pool_fd __P((void)); 307255332Scyextern int pool_ioctl __P((ioctlfunc_t, ioctlcmd_t, void *)); 308255332Scyextern int pool_open __P((void)); 309145510Sdarrenrextern char *portname __P((int, int)); 310145510Sdarrenrextern int pri_findname __P((char *)); 311145510Sdarrenrextern char *pri_toname __P((int)); 312255332Scyextern void print_toif __P((int, char *, char *, struct frdest *)); 313255332Scyextern void printaps __P((ap_session_t *, int, int)); 314255332Scyextern void printaddr __P((int, int, char *, int, u_32_t *, u_32_t *)); 315145510Sdarrenrextern void printbuf __P((char *, int, int)); 316255332Scyextern void printfieldhdr __P((wordtab_t *, wordtab_t *)); 317145510Sdarrenrextern void printfr __P((struct frentry *, ioctlfunc_t)); 318145510Sdarrenrextern struct iphtable_s *printhash __P((struct iphtable_s *, copyfunc_t, 319255332Scy char *, int, wordtab_t *)); 320255332Scyextern struct iphtable_s *printhash_live __P((iphtable_t *, int, char *, 321255332Scy int, wordtab_t *)); 322255332Scyextern ippool_dst_t *printdstl_live __P((ippool_dst_t *, int, char *, 323255332Scy int, wordtab_t *)); 324170268Sdarrenrextern void printhashdata __P((iphtable_t *, int)); 325145510Sdarrenrextern struct iphtent_s *printhashnode __P((struct iphtable_s *, 326145510Sdarrenr struct iphtent_s *, 327255332Scy copyfunc_t, int, wordtab_t *)); 328255332Scyextern void printhost __P((int, u_32_t *)); 329145510Sdarrenrextern void printhostmask __P((int, u_32_t *, u_32_t *)); 330255332Scyextern void printip __P((int, u_32_t *)); 331145510Sdarrenrextern void printlog __P((struct frentry *)); 332255332Scyextern void printlookup __P((char *, i6addr_t *addr, i6addr_t *mask)); 333255332Scyextern void printmask __P((int, u_32_t *)); 334255332Scyextern void printnataddr __P((int, char *, nat_addr_t *, int)); 335255332Scyextern void printnatfield __P((nat_t *, int)); 336255332Scyextern void printnatside __P((char *, nat_stat_side_t *)); 337255332Scyextern void printpacket __P((int, mb_t *)); 338255332Scyextern void printpacket6 __P((int, mb_t *)); 339255332Scyextern struct ippool_dst *printdstlist __P((struct ippool_dst *, copyfunc_t, 340255332Scy char *, int, ipf_dstnode_t *, 341255332Scy wordtab_t *)); 342255332Scyextern void printdstlistdata __P((ippool_dst_t *, int)); 343255332Scyextern ipf_dstnode_t *printdstlistnode __P((ipf_dstnode_t *, copyfunc_t, 344255332Scy int, wordtab_t *)); 345255332Scyextern void printdstlistpolicy __P((ippool_policy_t)); 346145510Sdarrenrextern struct ip_pool_s *printpool __P((struct ip_pool_s *, copyfunc_t, 347255332Scy char *, int, wordtab_t *)); 348170268Sdarrenrextern struct ip_pool_s *printpool_live __P((struct ip_pool_s *, int, 349255332Scy char *, int, wordtab_t *)); 350170268Sdarrenrextern void printpooldata __P((ip_pool_t *, int)); 351255332Scyextern void printpoolfield __P((void *, int, int)); 352255332Scyextern struct ip_pool_node *printpoolnode __P((struct ip_pool_node *, 353255332Scy int, wordtab_t *)); 354153881Sguidoextern void printproto __P((struct protoent *, int, struct ipnat *)); 355145510Sdarrenrextern void printportcmp __P((int, struct frpcmp *)); 356255332Scyextern void printstatefield __P((ipstate_t *, int)); 357255332Scyextern void printtqtable __P((ipftq_t *)); 358255332Scyextern void printtunable __P((ipftune_t *)); 359255332Scyextern void printunit __P((int)); 360145510Sdarrenrextern void optprint __P((u_short *, u_long, u_long)); 361145510Sdarrenr#ifdef USE_INET6 362145510Sdarrenrextern void optprintv6 __P((u_short *, u_long, u_long)); 36322514Sdarrenr#endif 364145510Sdarrenrextern int remove_hash __P((struct iphtable_s *, ioctlfunc_t)); 365145510Sdarrenrextern int remove_hashnode __P((int, char *, struct iphtent_s *, ioctlfunc_t)); 366145510Sdarrenrextern int remove_pool __P((ip_pool_t *, ioctlfunc_t)); 367145510Sdarrenrextern int remove_poolnode __P((int, char *, ip_pool_node_t *, ioctlfunc_t)); 368145510Sdarrenrextern u_char tcpflags __P((char *)); 369145510Sdarrenrextern void printc __P((struct frentry *)); 370145510Sdarrenrextern void printC __P((int)); 371145510Sdarrenrextern void emit __P((int, int, void *, struct frentry *)); 372145510Sdarrenrextern u_char secbit __P((int)); 373145510Sdarrenrextern u_char seclevel __P((char *)); 374145510Sdarrenrextern void printfraginfo __P((char *, struct ipfr *)); 375145510Sdarrenrextern void printifname __P((char *, char *, void *)); 376145510Sdarrenrextern char *hostname __P((int, void *)); 377145510Sdarrenrextern struct ipstate *printstate __P((struct ipstate *, int, u_long)); 378145510Sdarrenrextern void printsbuf __P((char *)); 379145510Sdarrenrextern void printnat __P((struct ipnat *, int)); 380255332Scyextern void printactiveaddress __P((int, char *, i6addr_t *, char *)); 381255332Scyextern void printactivenat __P((struct nat *, int, u_long)); 382145510Sdarrenrextern void printhostmap __P((struct hostmap *, u_int)); 383255332Scyextern void printtcpflags __P((u_32_t, u_32_t)); 384255332Scyextern void printipfexpr __P((int *)); 385255332Scyextern void printstatefield __P((ipstate_t *, int)); 386255332Scyextern void printstatefieldhdr __P((int)); 387255332Scyextern int sendtrap_v1_0 __P((int, char *, char *, int, time_t)); 388255332Scyextern int sendtrap_v2_0 __P((int, char *, char *, int)); 389255332Scyextern int vtof __P((int)); 39022514Sdarrenr 391145510Sdarrenrextern void set_variable __P((char *, char *)); 392145510Sdarrenrextern char *get_variable __P((char *, char **, int)); 393145510Sdarrenrextern void resetlexer __P((void)); 39422514Sdarrenr 395255332Scyextern void debug __P((int, char *, ...)); 396255332Scyextern void verbose __P((int, char *, ...)); 397255332Scyextern void ipfkdebug __P((char *, ...)); 398255332Scyextern void ipfkverbose __P((char *, ...)); 399255332Scy 400145510Sdarrenr#if SOLARIS 401145510Sdarrenrextern int gethostname __P((char *, int )); 402145510Sdarrenrextern void sync __P((void)); 40322514Sdarrenr#endif 40422514Sdarrenr 40526119Sdarrenr#endif /* __IPF_H__ */ 406