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