1d17aef79SPedro F. Giffuni /*- 23c0c8717SLuigi Rizzo * Copyright (c) 2002-2003 Luigi Rizzo 33c0c8717SLuigi Rizzo * Copyright (c) 1996 Alex Nash, Paul Traina, Poul-Henning Kamp 43c0c8717SLuigi Rizzo * Copyright (c) 1994 Ugen J.S.Antsilevich 53c0c8717SLuigi Rizzo * 63c0c8717SLuigi Rizzo * Idea and grammar partially left from: 73c0c8717SLuigi Rizzo * Copyright (c) 1993 Daniel Boulet 83c0c8717SLuigi Rizzo * 93c0c8717SLuigi Rizzo * Redistribution and use in source forms, with and without modification, 103c0c8717SLuigi Rizzo * are permitted provided that this entire comment appears intact. 113c0c8717SLuigi Rizzo * 123c0c8717SLuigi Rizzo * Redistribution in binary form may occur without any restrictions. 133c0c8717SLuigi Rizzo * Obviously, it would be nice if you gave credit where credit is due 143c0c8717SLuigi Rizzo * but requiring it would be too onerous. 153c0c8717SLuigi Rizzo * 163c0c8717SLuigi Rizzo * This software is provided ``AS IS'' without any warranties of any kind. 173c0c8717SLuigi Rizzo * 183c0c8717SLuigi Rizzo * NEW command line interface for IP firewall facility 193c0c8717SLuigi Rizzo * 203c0c8717SLuigi Rizzo * $FreeBSD$ 213c0c8717SLuigi Rizzo */ 223c0c8717SLuigi Rizzo 233c0c8717SLuigi Rizzo /* 243c0c8717SLuigi Rizzo * Options that can be set on the command line. 253c0c8717SLuigi Rizzo * When reading commands from a file, a subset of the options can also 263c0c8717SLuigi Rizzo * be applied globally by specifying them before the file name. 273c0c8717SLuigi Rizzo * After that, each line can contain its own option that changes 283c0c8717SLuigi Rizzo * the global value. 293c0c8717SLuigi Rizzo * XXX The context is not restored after each line. 303c0c8717SLuigi Rizzo */ 313c0c8717SLuigi Rizzo 323c0c8717SLuigi Rizzo struct cmdline_opts { 333c0c8717SLuigi Rizzo /* boolean options: */ 343c0c8717SLuigi Rizzo int do_value_as_ip; /* show table value as IP */ 353c0c8717SLuigi Rizzo int do_resolv; /* try to resolve all ip to names */ 363c0c8717SLuigi Rizzo int do_time; /* Show time stamps */ 373c0c8717SLuigi Rizzo int do_quiet; /* Be quiet in add and flush */ 38cc4d3c30SLuigi Rizzo int do_pipe; /* this cmd refers to a pipe/queue/sched */ 393c0c8717SLuigi Rizzo int do_nat; /* this cmd refers to a nat config */ 403c0c8717SLuigi Rizzo int do_compact; /* show rules in compact mode */ 413c0c8717SLuigi Rizzo int do_force; /* do not ask for confirmation */ 423c0c8717SLuigi Rizzo int show_sets; /* display the set each rule belongs to */ 433c0c8717SLuigi Rizzo int test_only; /* only check syntax */ 443c0c8717SLuigi Rizzo int comment_only; /* only print action and comment */ 453c0c8717SLuigi Rizzo int verbose; /* be verbose on some commands */ 463c0c8717SLuigi Rizzo 473c0c8717SLuigi Rizzo /* The options below can have multiple values. */ 483c0c8717SLuigi Rizzo 49*d66f9c86SAndrey V. Elsukov int do_dynamic; /* 1 - display dynamic rules */ 50*d66f9c86SAndrey V. Elsukov /* 2 - display/delete only dynamic rules */ 513c0c8717SLuigi Rizzo int do_sort; /* field to sort results (0 = no) */ 523c0c8717SLuigi Rizzo /* valid fields are 1 and above */ 533c0c8717SLuigi Rizzo 543c0c8717SLuigi Rizzo int use_set; /* work with specified set number */ 553c0c8717SLuigi Rizzo /* 0 means all sets, otherwise apply to set use_set - 1 */ 563c0c8717SLuigi Rizzo 573c0c8717SLuigi Rizzo }; 583c0c8717SLuigi Rizzo 59aed02679SAndrey V. Elsukov enum { 60aed02679SAndrey V. Elsukov TIMESTAMP_NONE = 0, 61aed02679SAndrey V. Elsukov TIMESTAMP_STRING, 62aed02679SAndrey V. Elsukov TIMESTAMP_NUMERIC, 63aed02679SAndrey V. Elsukov }; 64aed02679SAndrey V. Elsukov 653c0c8717SLuigi Rizzo extern struct cmdline_opts co; 663c0c8717SLuigi Rizzo 673c0c8717SLuigi Rizzo /* 683c0c8717SLuigi Rizzo * _s_x is a structure that stores a string <-> token pairs, used in 693c0c8717SLuigi Rizzo * various places in the parser. Entries are stored in arrays, 703c0c8717SLuigi Rizzo * with an entry with s=NULL as terminator. 713c0c8717SLuigi Rizzo * The search routines are match_token() and match_value(). 723c0c8717SLuigi Rizzo * Often, an element with x=0 contains an error string. 733c0c8717SLuigi Rizzo * 743c0c8717SLuigi Rizzo */ 753c0c8717SLuigi Rizzo struct _s_x { 763c0c8717SLuigi Rizzo char const *s; 773c0c8717SLuigi Rizzo int x; 783c0c8717SLuigi Rizzo }; 793c0c8717SLuigi Rizzo 80ac35ff17SAlexander V. Chernikov extern struct _s_x f_ipdscp[]; 81ac35ff17SAlexander V. Chernikov 824e9c8ae7SLuigi Rizzo enum tokens { 834e9c8ae7SLuigi Rizzo TOK_NULL=0, 844e9c8ae7SLuigi Rizzo 854e9c8ae7SLuigi Rizzo TOK_OR, 864e9c8ae7SLuigi Rizzo TOK_NOT, 874e9c8ae7SLuigi Rizzo TOK_STARTBRACE, 884e9c8ae7SLuigi Rizzo TOK_ENDBRACE, 894e9c8ae7SLuigi Rizzo 90665c8a2eSMichael Tuexen TOK_ABORT6, 91665c8a2eSMichael Tuexen TOK_ABORT, 924e9c8ae7SLuigi Rizzo TOK_ACCEPT, 934e9c8ae7SLuigi Rizzo TOK_COUNT, 942acdf79fSAndrey V. Elsukov TOK_EACTION, 954e9c8ae7SLuigi Rizzo TOK_PIPE, 96cc4d3c30SLuigi Rizzo TOK_LINK, 974e9c8ae7SLuigi Rizzo TOK_QUEUE, 98cc4d3c30SLuigi Rizzo TOK_FLOWSET, 99cc4d3c30SLuigi Rizzo TOK_SCHED, 1004e9c8ae7SLuigi Rizzo TOK_DIVERT, 1014e9c8ae7SLuigi Rizzo TOK_TEE, 1024e9c8ae7SLuigi Rizzo TOK_NETGRAPH, 1034e9c8ae7SLuigi Rizzo TOK_NGTEE, 1044e9c8ae7SLuigi Rizzo TOK_FORWARD, 1054e9c8ae7SLuigi Rizzo TOK_SKIPTO, 1064e9c8ae7SLuigi Rizzo TOK_DENY, 1074e9c8ae7SLuigi Rizzo TOK_REJECT, 1084e9c8ae7SLuigi Rizzo TOK_RESET, 1094e9c8ae7SLuigi Rizzo TOK_UNREACH, 1104e9c8ae7SLuigi Rizzo TOK_CHECKSTATE, 1114e9c8ae7SLuigi Rizzo TOK_NAT, 112eb2e4119SPaolo Pisati TOK_REASS, 1139527ec6eSAndrey V. Elsukov TOK_CALL, 1149527ec6eSAndrey V. Elsukov TOK_RETURN, 1154e9c8ae7SLuigi Rizzo 1164e9c8ae7SLuigi Rizzo TOK_ALTQ, 1174e9c8ae7SLuigi Rizzo TOK_LOG, 1184e9c8ae7SLuigi Rizzo TOK_TAG, 1194e9c8ae7SLuigi Rizzo TOK_UNTAG, 1204e9c8ae7SLuigi Rizzo 1214e9c8ae7SLuigi Rizzo TOK_TAGGED, 1224e9c8ae7SLuigi Rizzo TOK_UID, 1234e9c8ae7SLuigi Rizzo TOK_GID, 1244e9c8ae7SLuigi Rizzo TOK_JAIL, 1254e9c8ae7SLuigi Rizzo TOK_IN, 1264e9c8ae7SLuigi Rizzo TOK_LIMIT, 127f7c4fdeeSAndrey V. Elsukov TOK_SETLIMIT, 1284e9c8ae7SLuigi Rizzo TOK_KEEPSTATE, 129f7c4fdeeSAndrey V. Elsukov TOK_RECORDSTATE, 1304e9c8ae7SLuigi Rizzo TOK_LAYER2, 1314e9c8ae7SLuigi Rizzo TOK_OUT, 1324e9c8ae7SLuigi Rizzo TOK_DIVERTED, 1334e9c8ae7SLuigi Rizzo TOK_DIVERTEDLOOPBACK, 1344e9c8ae7SLuigi Rizzo TOK_DIVERTEDOUTPUT, 1354e9c8ae7SLuigi Rizzo TOK_XMIT, 1364e9c8ae7SLuigi Rizzo TOK_RECV, 1374e9c8ae7SLuigi Rizzo TOK_VIA, 1384e9c8ae7SLuigi Rizzo TOK_FRAG, 1394e9c8ae7SLuigi Rizzo TOK_IPOPTS, 1404e9c8ae7SLuigi Rizzo TOK_IPLEN, 1414e9c8ae7SLuigi Rizzo TOK_IPID, 1424e9c8ae7SLuigi Rizzo TOK_IPPRECEDENCE, 14372662a75SLuigi Rizzo TOK_DSCP, 1444e9c8ae7SLuigi Rizzo TOK_IPTOS, 1454e9c8ae7SLuigi Rizzo TOK_IPTTL, 1464e9c8ae7SLuigi Rizzo TOK_IPVER, 1474e9c8ae7SLuigi Rizzo TOK_ESTAB, 1484e9c8ae7SLuigi Rizzo TOK_SETUP, 1494e9c8ae7SLuigi Rizzo TOK_TCPDATALEN, 1504e9c8ae7SLuigi Rizzo TOK_TCPFLAGS, 1514e9c8ae7SLuigi Rizzo TOK_TCPOPTS, 1524e9c8ae7SLuigi Rizzo TOK_TCPSEQ, 1534e9c8ae7SLuigi Rizzo TOK_TCPACK, 1544e9c8ae7SLuigi Rizzo TOK_TCPWIN, 1554e9c8ae7SLuigi Rizzo TOK_ICMPTYPES, 1564e9c8ae7SLuigi Rizzo TOK_MAC, 1574e9c8ae7SLuigi Rizzo TOK_MACTYPE, 1584e9c8ae7SLuigi Rizzo TOK_VERREVPATH, 1594e9c8ae7SLuigi Rizzo TOK_VERSRCREACH, 1604e9c8ae7SLuigi Rizzo TOK_ANTISPOOF, 1614e9c8ae7SLuigi Rizzo TOK_IPSEC, 1624e9c8ae7SLuigi Rizzo TOK_COMMENT, 1634e9c8ae7SLuigi Rizzo 1644e9c8ae7SLuigi Rizzo TOK_PLR, 1654e9c8ae7SLuigi Rizzo TOK_NOERROR, 1664e9c8ae7SLuigi Rizzo TOK_BUCKETS, 1674e9c8ae7SLuigi Rizzo TOK_DSTIP, 1684e9c8ae7SLuigi Rizzo TOK_SRCIP, 1694e9c8ae7SLuigi Rizzo TOK_DSTPORT, 1704e9c8ae7SLuigi Rizzo TOK_SRCPORT, 1714e9c8ae7SLuigi Rizzo TOK_ALL, 1724e9c8ae7SLuigi Rizzo TOK_MASK, 173cc4d3c30SLuigi Rizzo TOK_FLOW_MASK, 174cc4d3c30SLuigi Rizzo TOK_SCHED_MASK, 1754e9c8ae7SLuigi Rizzo TOK_BW, 1764e9c8ae7SLuigi Rizzo TOK_DELAY, 177cc4d3c30SLuigi Rizzo TOK_PROFILE, 1786882bf4dSOleg Bulyzhin TOK_BURST, 1794e9c8ae7SLuigi Rizzo TOK_RED, 1804e9c8ae7SLuigi Rizzo TOK_GRED, 181fc5e1956SHiren Panchasara TOK_ECN, 1824e9c8ae7SLuigi Rizzo TOK_DROPTAIL, 1834e9c8ae7SLuigi Rizzo TOK_PROTO, 18491336b40SDon Lewis #ifdef NEW_AQM 18591336b40SDon Lewis /* AQM tokens*/ 18691336b40SDon Lewis TOK_NO_ECN, 18791336b40SDon Lewis TOK_CODEL, 18891336b40SDon Lewis TOK_FQ_CODEL, 18991336b40SDon Lewis TOK_TARGET, 19091336b40SDon Lewis TOK_INTERVAL, 19191336b40SDon Lewis TOK_FLOWS, 19291336b40SDon Lewis TOK_QUANTUM, 19391336b40SDon Lewis 19491336b40SDon Lewis TOK_PIE, 19591336b40SDon Lewis TOK_FQ_PIE, 19691336b40SDon Lewis TOK_TUPDATE, 19791336b40SDon Lewis TOK_MAX_BURST, 19891336b40SDon Lewis TOK_MAX_ECNTH, 19991336b40SDon Lewis TOK_ALPHA, 20091336b40SDon Lewis TOK_BETA, 20191336b40SDon Lewis TOK_CAPDROP, 20291336b40SDon Lewis TOK_NO_CAPDROP, 20391336b40SDon Lewis TOK_ONOFF, 20491336b40SDon Lewis TOK_DRE, 20591336b40SDon Lewis TOK_TS, 20691336b40SDon Lewis TOK_DERAND, 20791336b40SDon Lewis TOK_NO_DERAND, 20891336b40SDon Lewis #endif 209cc4d3c30SLuigi Rizzo /* dummynet tokens */ 2104e9c8ae7SLuigi Rizzo TOK_WEIGHT, 211cc4d3c30SLuigi Rizzo TOK_LMAX, 212cc4d3c30SLuigi Rizzo TOK_PRI, 213cc4d3c30SLuigi Rizzo TOK_TYPE, 214cc4d3c30SLuigi Rizzo TOK_SLOTSIZE, 215cc4d3c30SLuigi Rizzo 2164e9c8ae7SLuigi Rizzo TOK_IP, 2174e9c8ae7SLuigi Rizzo TOK_IF, 2184e9c8ae7SLuigi Rizzo TOK_ALOG, 2194e9c8ae7SLuigi Rizzo TOK_DENY_INC, 2204e9c8ae7SLuigi Rizzo TOK_SAME_PORTS, 2214e9c8ae7SLuigi Rizzo TOK_UNREG_ONLY, 2221875bbfeSAndrey V. Elsukov TOK_SKIP_GLOBAL, 2234e9c8ae7SLuigi Rizzo TOK_RESET_ADDR, 2244e9c8ae7SLuigi Rizzo TOK_ALIAS_REV, 2254e9c8ae7SLuigi Rizzo TOK_PROXY_ONLY, 2264e9c8ae7SLuigi Rizzo TOK_REDIR_ADDR, 2274e9c8ae7SLuigi Rizzo TOK_REDIR_PORT, 2284e9c8ae7SLuigi Rizzo TOK_REDIR_PROTO, 2294e9c8ae7SLuigi Rizzo 2304e9c8ae7SLuigi Rizzo TOK_IPV6, 2314e9c8ae7SLuigi Rizzo TOK_FLOWID, 2324e9c8ae7SLuigi Rizzo TOK_ICMP6TYPES, 2334e9c8ae7SLuigi Rizzo TOK_EXT6HDR, 2344e9c8ae7SLuigi Rizzo TOK_DSTIP6, 2354e9c8ae7SLuigi Rizzo TOK_SRCIP6, 2364e9c8ae7SLuigi Rizzo 2374e9c8ae7SLuigi Rizzo TOK_IPV4, 2384e9c8ae7SLuigi Rizzo TOK_UNREACH6, 2394e9c8ae7SLuigi Rizzo TOK_RESET6, 2404e9c8ae7SLuigi Rizzo 2414e9c8ae7SLuigi Rizzo TOK_FIB, 2424e9c8ae7SLuigi Rizzo TOK_SETFIB, 243472099c4SLuigi Rizzo TOK_LOOKUP, 244ae99fd0eSLuigi Rizzo TOK_SOCKARG, 245ae01d73cSAlexander V. Chernikov TOK_SETDSCP, 246358b9d09SAlexander V. Chernikov TOK_FLOW, 247358b9d09SAlexander V. Chernikov TOK_IFLIST, 248ac35ff17SAlexander V. Chernikov /* Table tokens */ 249ac35ff17SAlexander V. Chernikov TOK_CREATE, 250ac35ff17SAlexander V. Chernikov TOK_DESTROY, 251ac35ff17SAlexander V. Chernikov TOK_LIST, 252ac35ff17SAlexander V. Chernikov TOK_INFO, 253358b9d09SAlexander V. Chernikov TOK_DETAIL, 254adf3b2b9SAlexander V. Chernikov TOK_MODIFY, 255ac35ff17SAlexander V. Chernikov TOK_FLUSH, 25646d52008SAlexander V. Chernikov TOK_SWAP, 257ac35ff17SAlexander V. Chernikov TOK_ADD, 258ac35ff17SAlexander V. Chernikov TOK_DEL, 259ac35ff17SAlexander V. Chernikov TOK_VALTYPE, 260ac35ff17SAlexander V. Chernikov TOK_ALGO, 261358b9d09SAlexander V. Chernikov TOK_TALIST, 2623a845e10SAlexander V. Chernikov TOK_ATOMIC, 2634f43138aSAlexander V. Chernikov TOK_LOCK, 2644f43138aSAlexander V. Chernikov TOK_UNLOCK, 2650cba2b28SAlexander V. Chernikov TOK_VLIST, 2665dc5a0e0SAndrey V. Elsukov TOK_OLIST, 267d8caf56eSAndrey V. Elsukov 268d8caf56eSAndrey V. Elsukov /* NAT64 tokens */ 269d8caf56eSAndrey V. Elsukov TOK_NAT64STL, 270d8caf56eSAndrey V. Elsukov TOK_NAT64LSN, 271b867e84eSAndrey V. Elsukov TOK_STATS, 272d8caf56eSAndrey V. Elsukov TOK_STATES, 273d8caf56eSAndrey V. Elsukov TOK_CONFIG, 274d8caf56eSAndrey V. Elsukov TOK_TABLE4, 275d8caf56eSAndrey V. Elsukov TOK_TABLE6, 276d8caf56eSAndrey V. Elsukov TOK_PREFIX4, 277d8caf56eSAndrey V. Elsukov TOK_PREFIX6, 278d8caf56eSAndrey V. Elsukov TOK_AGG_LEN, 279d8caf56eSAndrey V. Elsukov TOK_AGG_COUNT, 280d8caf56eSAndrey V. Elsukov TOK_MAX_PORTS, 281d8caf56eSAndrey V. Elsukov TOK_JMAXLEN, 282d8caf56eSAndrey V. Elsukov TOK_PORT_RANGE, 283d8caf56eSAndrey V. Elsukov TOK_HOST_DEL_AGE, 284d8caf56eSAndrey V. Elsukov TOK_PG_DEL_AGE, 285d8caf56eSAndrey V. Elsukov TOK_TCP_SYN_AGE, 286d8caf56eSAndrey V. Elsukov TOK_TCP_CLOSE_AGE, 287d8caf56eSAndrey V. Elsukov TOK_TCP_EST_AGE, 288d8caf56eSAndrey V. Elsukov TOK_UDP_AGE, 289d8caf56eSAndrey V. Elsukov TOK_ICMP_AGE, 290d8caf56eSAndrey V. Elsukov TOK_LOGOFF, 291b867e84eSAndrey V. Elsukov 292b867e84eSAndrey V. Elsukov /* NPTv6 tokens */ 293b867e84eSAndrey V. Elsukov TOK_NPTV6, 294b867e84eSAndrey V. Elsukov TOK_INTPREFIX, 295b867e84eSAndrey V. Elsukov TOK_EXTPREFIX, 296b867e84eSAndrey V. Elsukov TOK_PREFIXLEN, 297b2b56606SAndrey V. Elsukov TOK_EXTIF, 298aac74aeaSAndrey V. Elsukov 299aac74aeaSAndrey V. Elsukov TOK_TCPSETMSS, 300f7c4fdeeSAndrey V. Elsukov 301f7c4fdeeSAndrey V. Elsukov TOK_SKIPACTION, 3024e9c8ae7SLuigi Rizzo }; 3031940fa77SAlexander V. Chernikov 3043c0c8717SLuigi Rizzo /* 3053c0c8717SLuigi Rizzo * the following macro returns an error message if we run out of 3063c0c8717SLuigi Rizzo * arguments. 3073c0c8717SLuigi Rizzo */ 308cc4d3c30SLuigi Rizzo #define NEED(_p, msg) {if (!_p) errx(EX_USAGE, msg);} 309cc4d3c30SLuigi Rizzo #define NEED1(msg) {if (!(*av)) errx(EX_USAGE, msg);} 3103c0c8717SLuigi Rizzo 311563b5ab1SAlexander V. Chernikov struct buf_pr { 312563b5ab1SAlexander V. Chernikov char *buf; /* allocated buffer */ 313563b5ab1SAlexander V. Chernikov char *ptr; /* current pointer */ 314563b5ab1SAlexander V. Chernikov size_t size; /* total buffer size */ 315563b5ab1SAlexander V. Chernikov size_t avail; /* available storage */ 316563b5ab1SAlexander V. Chernikov size_t needed; /* length needed */ 317563b5ab1SAlexander V. Chernikov }; 318563b5ab1SAlexander V. Chernikov 319563b5ab1SAlexander V. Chernikov int pr_u64(struct buf_pr *bp, uint64_t *pd, int width); 320563b5ab1SAlexander V. Chernikov int bp_alloc(struct buf_pr *b, size_t size); 321563b5ab1SAlexander V. Chernikov void bp_free(struct buf_pr *b); 322563b5ab1SAlexander V. Chernikov int bprintf(struct buf_pr *b, char *format, ...); 323563b5ab1SAlexander V. Chernikov 32450a99912SLuigi Rizzo 3253c0c8717SLuigi Rizzo /* memory allocation support */ 3263c0c8717SLuigi Rizzo void *safe_calloc(size_t number, size_t size); 3273c0c8717SLuigi Rizzo void *safe_realloc(void *ptr, size_t size); 3283c0c8717SLuigi Rizzo 329ead75a59SLuigi Rizzo /* string comparison functions used for historical compatibility */ 3303c0c8717SLuigi Rizzo int _substrcmp(const char *str1, const char* str2); 3314e9c8ae7SLuigi Rizzo int _substrcmp2(const char *str1, const char* str2, const char* str3); 33268394ec8SAlexander V. Chernikov int stringnum_cmp(const char *a, const char *b); 3334e9c8ae7SLuigi Rizzo 334ead75a59SLuigi Rizzo /* utility functions */ 3352acdf79fSAndrey V. Elsukov int match_token(struct _s_x *table, const char *string); 3362acdf79fSAndrey V. Elsukov int match_token_relaxed(struct _s_x *table, const char *string); 3372acdf79fSAndrey V. Elsukov int get_token(struct _s_x *table, const char *string, const char *errbase); 338ead75a59SLuigi Rizzo char const *match_value(struct _s_x *p, int value); 339ac35ff17SAlexander V. Chernikov size_t concat_tokens(char *buf, size_t bufsize, struct _s_x *table, 340ac35ff17SAlexander V. Chernikov char *delimiter); 3410cba2b28SAlexander V. Chernikov int fill_flags(struct _s_x *flags, char *p, char **e, uint32_t *set, 3420cba2b28SAlexander V. Chernikov uint32_t *clear); 3430cba2b28SAlexander V. Chernikov void print_flags_buffer(char *buf, size_t sz, struct _s_x *list, uint32_t set); 344ead75a59SLuigi Rizzo 345f1220db8SAlexander V. Chernikov struct _ip_fw3_opheader; 3464e9c8ae7SLuigi Rizzo int do_cmd(int optname, void *optval, uintptr_t optlen); 3476d3c367dSMarius Strobl int do_set3(int optname, struct _ip_fw3_opheader *op3, size_t optlen); 348f1220db8SAlexander V. Chernikov int do_get3(int optname, struct _ip_fw3_opheader *op3, size_t *optlen); 3491058f177SAlexander V. Chernikov 3504e9c8ae7SLuigi Rizzo struct in6_addr; 3514e9c8ae7SLuigi Rizzo void n2mask(struct in6_addr *mask, int n); 352ead75a59SLuigi Rizzo int contigmask(uint8_t *p, int len); 353ead75a59SLuigi Rizzo 35416e3606fSLuigi Rizzo /* 35516e3606fSLuigi Rizzo * Forward declarations to avoid include way too many headers. 35616e3606fSLuigi Rizzo * C does not allow duplicated typedefs, so we use the base struct 35716e3606fSLuigi Rizzo * that the typedef points to. 35816e3606fSLuigi Rizzo * Should the typedefs use a different type, the compiler will 35916e3606fSLuigi Rizzo * still detect the change when compiling the body of the 36016e3606fSLuigi Rizzo * functions involved, so we do not lose error checking. 36116e3606fSLuigi Rizzo */ 36216e3606fSLuigi Rizzo struct _ipfw_insn; 36323c608c8SLuigi Rizzo struct _ipfw_insn_altq; 36416e3606fSLuigi Rizzo struct _ipfw_insn_u32; 36516e3606fSLuigi Rizzo struct _ipfw_insn_ip6; 36616e3606fSLuigi Rizzo struct _ipfw_insn_icmp6; 3673c0c8717SLuigi Rizzo 3683c0c8717SLuigi Rizzo /* 3693c0c8717SLuigi Rizzo * The reserved set numer. This is a constant in ip_fw.h 3703c0c8717SLuigi Rizzo * but we store it in a variable so other files do not depend 3713c0c8717SLuigi Rizzo * in that header just for one constant. 3723c0c8717SLuigi Rizzo */ 3733c0c8717SLuigi Rizzo extern int resvd_set_number; 3743c0c8717SLuigi Rizzo 375ead75a59SLuigi Rizzo /* first-level command handlers */ 376cc4d3c30SLuigi Rizzo void ipfw_add(char *av[]); 3773c0c8717SLuigi Rizzo void ipfw_show_nat(int ac, char **av); 3783c0c8717SLuigi Rizzo void ipfw_config_pipe(int ac, char **av); 3793c0c8717SLuigi Rizzo void ipfw_config_nat(int ac, char **av); 380cc4d3c30SLuigi Rizzo void ipfw_sets_handler(char *av[]); 3813c0c8717SLuigi Rizzo void ipfw_table_handler(int ac, char *av[]); 382cc4d3c30SLuigi Rizzo void ipfw_sysctl_handler(char *av[], int which); 383cc4d3c30SLuigi Rizzo void ipfw_delete(char *av[]); 3843c0c8717SLuigi Rizzo void ipfw_flush(int force); 3853c0c8717SLuigi Rizzo void ipfw_zero(int ac, char *av[], int optname); 3863c0c8717SLuigi Rizzo void ipfw_list(int ac, char *av[], int show_counters); 387358b9d09SAlexander V. Chernikov void ipfw_internal_handler(int ac, char *av[]); 388d8caf56eSAndrey V. Elsukov void ipfw_nat64lsn_handler(int ac, char *av[]); 389d8caf56eSAndrey V. Elsukov void ipfw_nat64stl_handler(int ac, char *av[]); 390b867e84eSAndrey V. Elsukov void ipfw_nptv6_handler(int ac, char *av[]); 3912acdf79fSAndrey V. Elsukov int ipfw_check_object_name(const char *name); 392782360deSAndrey V. Elsukov int ipfw_check_nat64prefix(const struct in6_addr *prefix, int length); 3933c0c8717SLuigi Rizzo 3949968f056SGleb Smirnoff #ifdef PF 39523c608c8SLuigi Rizzo /* altq.c */ 39623c608c8SLuigi Rizzo void altq_set_enabled(int enabled); 39723c608c8SLuigi Rizzo u_int32_t altq_name_to_qid(const char *name); 398563b5ab1SAlexander V. Chernikov void print_altq_cmd(struct buf_pr *bp, struct _ipfw_insn_altq *altqptr); 3999968f056SGleb Smirnoff #else 4009968f056SGleb Smirnoff #define NO_ALTQ 4019968f056SGleb Smirnoff #endif 40223c608c8SLuigi Rizzo 403ead75a59SLuigi Rizzo /* dummynet.c */ 404cc4d3c30SLuigi Rizzo void dummynet_list(int ac, char *av[], int show_counters); 405cc4d3c30SLuigi Rizzo void dummynet_flush(void); 4064e9c8ae7SLuigi Rizzo int ipfw_delete_pipe(int pipe_or_queue, int n); 4074e9c8ae7SLuigi Rizzo 408ead75a59SLuigi Rizzo /* ipv6.c */ 4097b34dbe4SAndrey V. Elsukov void print_unreach6_code(struct buf_pr *bp, uint16_t code); 410bd32e335SAndrey V. Elsukov void print_ip6(struct buf_pr *bp, struct _ipfw_insn_ip6 *cmd); 4114df4dadaSAlexander V. Chernikov void print_flow6id(struct buf_pr *bp, struct _ipfw_insn_u32 *cmd); 4124df4dadaSAlexander V. Chernikov void print_icmp6types(struct buf_pr *bp, struct _ipfw_insn_u32 *cmd); 4134df4dadaSAlexander V. Chernikov void print_ext6hdr(struct buf_pr *bp, struct _ipfw_insn *cmd ); 414ead75a59SLuigi Rizzo 415757b5d87SAndrey V. Elsukov struct tidx; 416757b5d87SAndrey V. Elsukov struct _ipfw_insn *add_srcip6(struct _ipfw_insn *cmd, char *av, int cblen, 417757b5d87SAndrey V. Elsukov struct tidx *tstate); 418757b5d87SAndrey V. Elsukov struct _ipfw_insn *add_dstip6(struct _ipfw_insn *cmd, char *av, int cblen, 419757b5d87SAndrey V. Elsukov struct tidx *tstate); 420ead75a59SLuigi Rizzo 421579ed7bdSAlexander V. Chernikov void fill_flow6(struct _ipfw_insn_u32 *cmd, char *av, int cblen); 422ead75a59SLuigi Rizzo void fill_unreach6_code(u_short *codep, char *str); 423579ed7bdSAlexander V. Chernikov void fill_icmp6types(struct _ipfw_insn_icmp6 *cmd, char *av, int cblen); 42416e3606fSLuigi Rizzo int fill_ext6hdr(struct _ipfw_insn *cmd, char *av); 425563b5ab1SAlexander V. Chernikov 426b04471d8SCy Schubert /* ipfw2.c */ 427b04471d8SCy Schubert void bp_flush(struct buf_pr *b); 428757b5d87SAndrey V. Elsukov void fill_table(struct _ipfw_insn *cmd, char *av, uint8_t opcode, 429757b5d87SAndrey V. Elsukov struct tidx *tstate); 430b04471d8SCy Schubert 431563b5ab1SAlexander V. Chernikov /* tables.c */ 432563b5ab1SAlexander V. Chernikov struct _ipfw_obj_ctlv; 433d8caf56eSAndrey V. Elsukov struct _ipfw_obj_ntlv; 4342acdf79fSAndrey V. Elsukov int table_check_name(const char *tablename); 435358b9d09SAlexander V. Chernikov void ipfw_list_ta(int ac, char *av[]); 4360cba2b28SAlexander V. Chernikov void ipfw_list_values(int ac, char *av[]); 437d8caf56eSAndrey V. Elsukov void table_fill_ntlv(struct _ipfw_obj_ntlv *ntlv, const char *name, 438d8caf56eSAndrey V. Elsukov uint8_t set, uint16_t uidx); 439563b5ab1SAlexander V. Chernikov 440