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 210b95680eSKristof Provost enum cmdline_prog { 220b95680eSKristof Provost cmdline_prog_ipfw, 230b95680eSKristof Provost cmdline_prog_dnctl 240b95680eSKristof Provost }; 250b95680eSKristof Provost 263c0c8717SLuigi Rizzo /* 273c0c8717SLuigi Rizzo * Options that can be set on the command line. 283c0c8717SLuigi Rizzo * When reading commands from a file, a subset of the options can also 293c0c8717SLuigi Rizzo * be applied globally by specifying them before the file name. 303c0c8717SLuigi Rizzo * After that, each line can contain its own option that changes 313c0c8717SLuigi Rizzo * the global value. 323c0c8717SLuigi Rizzo * XXX The context is not restored after each line. 333c0c8717SLuigi Rizzo */ 343c0c8717SLuigi Rizzo 353c0c8717SLuigi Rizzo struct cmdline_opts { 363c0c8717SLuigi Rizzo /* boolean options: */ 373c0c8717SLuigi Rizzo int do_value_as_ip; /* show table value as IP */ 383c0c8717SLuigi Rizzo int do_resolv; /* try to resolve all ip to names */ 393c0c8717SLuigi Rizzo int do_time; /* Show time stamps */ 403c0c8717SLuigi Rizzo int do_quiet; /* Be quiet in add and flush */ 41cc4d3c30SLuigi Rizzo int do_pipe; /* this cmd refers to a pipe/queue/sched */ 423c0c8717SLuigi Rizzo int do_nat; /* this cmd refers to a nat config */ 433c0c8717SLuigi Rizzo int do_compact; /* show rules in compact mode */ 443c0c8717SLuigi Rizzo int do_force; /* do not ask for confirmation */ 453c0c8717SLuigi Rizzo int show_sets; /* display the set each rule belongs to */ 463c0c8717SLuigi Rizzo int test_only; /* only check syntax */ 473c0c8717SLuigi Rizzo int comment_only; /* only print action and comment */ 483c0c8717SLuigi Rizzo int verbose; /* be verbose on some commands */ 499f44a47fSAlexander V. Chernikov int debug_only; /* output ioctl i/o on stdout */ 503c0c8717SLuigi Rizzo 513c0c8717SLuigi Rizzo /* The options below can have multiple values. */ 523c0c8717SLuigi Rizzo 53d66f9c86SAndrey V. Elsukov int do_dynamic; /* 1 - display dynamic rules */ 54d66f9c86SAndrey V. Elsukov /* 2 - display/delete only dynamic rules */ 553c0c8717SLuigi Rizzo int do_sort; /* field to sort results (0 = no) */ 563c0c8717SLuigi Rizzo /* valid fields are 1 and above */ 573c0c8717SLuigi Rizzo 5856707beeSMark Johnston uint32_t use_set; /* work with specified set number */ 593c0c8717SLuigi Rizzo /* 0 means all sets, otherwise apply to set use_set - 1 */ 603c0c8717SLuigi Rizzo 610b95680eSKristof Provost enum cmdline_prog prog; /* Are we ipfw or dnctl? */ 623c0c8717SLuigi Rizzo }; 633c0c8717SLuigi Rizzo 640b95680eSKristof Provost int is_ipfw(void); 650b95680eSKristof Provost 66aed02679SAndrey V. Elsukov enum { 67aed02679SAndrey V. Elsukov TIMESTAMP_NONE = 0, 68aed02679SAndrey V. Elsukov TIMESTAMP_STRING, 69aed02679SAndrey V. Elsukov TIMESTAMP_NUMERIC, 70aed02679SAndrey V. Elsukov }; 71aed02679SAndrey V. Elsukov 7256707beeSMark Johnston extern struct cmdline_opts g_co; 733c0c8717SLuigi Rizzo 743c0c8717SLuigi Rizzo /* 753c0c8717SLuigi Rizzo * _s_x is a structure that stores a string <-> token pairs, used in 763c0c8717SLuigi Rizzo * various places in the parser. Entries are stored in arrays, 773c0c8717SLuigi Rizzo * with an entry with s=NULL as terminator. 783c0c8717SLuigi Rizzo * The search routines are match_token() and match_value(). 793c0c8717SLuigi Rizzo * Often, an element with x=0 contains an error string. 803c0c8717SLuigi Rizzo * 813c0c8717SLuigi Rizzo */ 823c0c8717SLuigi Rizzo struct _s_x { 833c0c8717SLuigi Rizzo char const *s; 843c0c8717SLuigi Rizzo int x; 853c0c8717SLuigi Rizzo }; 863c0c8717SLuigi Rizzo 87ac35ff17SAlexander V. Chernikov extern struct _s_x f_ipdscp[]; 88ac35ff17SAlexander V. Chernikov 894e9c8ae7SLuigi Rizzo enum tokens { 904e9c8ae7SLuigi Rizzo TOK_NULL=0, 914e9c8ae7SLuigi Rizzo 924e9c8ae7SLuigi Rizzo TOK_OR, 934e9c8ae7SLuigi Rizzo TOK_NOT, 944e9c8ae7SLuigi Rizzo TOK_STARTBRACE, 954e9c8ae7SLuigi Rizzo TOK_ENDBRACE, 964e9c8ae7SLuigi Rizzo 97665c8a2eSMichael Tuexen TOK_ABORT6, 98665c8a2eSMichael Tuexen TOK_ABORT, 994e9c8ae7SLuigi Rizzo TOK_ACCEPT, 1004e9c8ae7SLuigi Rizzo TOK_COUNT, 1012acdf79fSAndrey V. Elsukov TOK_EACTION, 1024e9c8ae7SLuigi Rizzo TOK_PIPE, 103cc4d3c30SLuigi Rizzo TOK_LINK, 1044e9c8ae7SLuigi Rizzo TOK_QUEUE, 105cc4d3c30SLuigi Rizzo TOK_FLOWSET, 106cc4d3c30SLuigi Rizzo TOK_SCHED, 1074e9c8ae7SLuigi Rizzo TOK_DIVERT, 1084e9c8ae7SLuigi Rizzo TOK_TEE, 1094e9c8ae7SLuigi Rizzo TOK_NETGRAPH, 1104e9c8ae7SLuigi Rizzo TOK_NGTEE, 1114e9c8ae7SLuigi Rizzo TOK_FORWARD, 1124e9c8ae7SLuigi Rizzo TOK_SKIPTO, 1134e9c8ae7SLuigi Rizzo TOK_DENY, 1144e9c8ae7SLuigi Rizzo TOK_REJECT, 1154e9c8ae7SLuigi Rizzo TOK_RESET, 1164e9c8ae7SLuigi Rizzo TOK_UNREACH, 1174e9c8ae7SLuigi Rizzo TOK_CHECKSTATE, 1184e9c8ae7SLuigi Rizzo TOK_NAT, 119eb2e4119SPaolo Pisati TOK_REASS, 1209527ec6eSAndrey V. Elsukov TOK_CALL, 1219527ec6eSAndrey V. Elsukov TOK_RETURN, 1224e9c8ae7SLuigi Rizzo 1234e9c8ae7SLuigi Rizzo TOK_ALTQ, 1244e9c8ae7SLuigi Rizzo TOK_LOG, 1254e9c8ae7SLuigi Rizzo TOK_TAG, 1264e9c8ae7SLuigi Rizzo TOK_UNTAG, 1274e9c8ae7SLuigi Rizzo 1284e9c8ae7SLuigi Rizzo TOK_TAGGED, 1294e9c8ae7SLuigi Rizzo TOK_UID, 1304e9c8ae7SLuigi Rizzo TOK_GID, 1314e9c8ae7SLuigi Rizzo TOK_JAIL, 1324e9c8ae7SLuigi Rizzo TOK_IN, 1334e9c8ae7SLuigi Rizzo TOK_LIMIT, 134f7c4fdeeSAndrey V. Elsukov TOK_SETLIMIT, 1354e9c8ae7SLuigi Rizzo TOK_KEEPSTATE, 136f7c4fdeeSAndrey V. Elsukov TOK_RECORDSTATE, 1374e9c8ae7SLuigi Rizzo TOK_LAYER2, 1384e9c8ae7SLuigi Rizzo TOK_OUT, 1394e9c8ae7SLuigi Rizzo TOK_DIVERTED, 1404e9c8ae7SLuigi Rizzo TOK_DIVERTEDLOOPBACK, 1414e9c8ae7SLuigi Rizzo TOK_DIVERTEDOUTPUT, 1424e9c8ae7SLuigi Rizzo TOK_XMIT, 1434e9c8ae7SLuigi Rizzo TOK_RECV, 1444e9c8ae7SLuigi Rizzo TOK_VIA, 1454e9c8ae7SLuigi Rizzo TOK_FRAG, 1464e9c8ae7SLuigi Rizzo TOK_IPOPTS, 1474e9c8ae7SLuigi Rizzo TOK_IPLEN, 1484e9c8ae7SLuigi Rizzo TOK_IPID, 1494e9c8ae7SLuigi Rizzo TOK_IPPRECEDENCE, 15072662a75SLuigi Rizzo TOK_DSCP, 1514e9c8ae7SLuigi Rizzo TOK_IPTOS, 1524e9c8ae7SLuigi Rizzo TOK_IPTTL, 1534e9c8ae7SLuigi Rizzo TOK_IPVER, 1544e9c8ae7SLuigi Rizzo TOK_ESTAB, 1554e9c8ae7SLuigi Rizzo TOK_SETUP, 1564e9c8ae7SLuigi Rizzo TOK_TCPDATALEN, 1574e9c8ae7SLuigi Rizzo TOK_TCPFLAGS, 1584e9c8ae7SLuigi Rizzo TOK_TCPOPTS, 1594e9c8ae7SLuigi Rizzo TOK_TCPSEQ, 1604e9c8ae7SLuigi Rizzo TOK_TCPACK, 161978f2d17SAndrey V. Elsukov TOK_TCPMSS, 1624e9c8ae7SLuigi Rizzo TOK_TCPWIN, 1634e9c8ae7SLuigi Rizzo TOK_ICMPTYPES, 1644e9c8ae7SLuigi Rizzo TOK_MAC, 1654e9c8ae7SLuigi Rizzo TOK_MACTYPE, 1664e9c8ae7SLuigi Rizzo TOK_VERREVPATH, 1674e9c8ae7SLuigi Rizzo TOK_VERSRCREACH, 1684e9c8ae7SLuigi Rizzo TOK_ANTISPOOF, 1694e9c8ae7SLuigi Rizzo TOK_IPSEC, 1704e9c8ae7SLuigi Rizzo TOK_COMMENT, 1714e9c8ae7SLuigi Rizzo 1724e9c8ae7SLuigi Rizzo TOK_PLR, 1734e9c8ae7SLuigi Rizzo TOK_NOERROR, 1744e9c8ae7SLuigi Rizzo TOK_BUCKETS, 1754e9c8ae7SLuigi Rizzo TOK_DSTIP, 1764e9c8ae7SLuigi Rizzo TOK_SRCIP, 1774e9c8ae7SLuigi Rizzo TOK_DSTPORT, 1784e9c8ae7SLuigi Rizzo TOK_SRCPORT, 17981cac390SArseny Smalyuk TOK_DSTMAC, 18081cac390SArseny Smalyuk TOK_SRCMAC, 1814e9c8ae7SLuigi Rizzo TOK_ALL, 1824e9c8ae7SLuigi Rizzo TOK_MASK, 183cc4d3c30SLuigi Rizzo TOK_FLOW_MASK, 184cc4d3c30SLuigi Rizzo TOK_SCHED_MASK, 1854e9c8ae7SLuigi Rizzo TOK_BW, 1864e9c8ae7SLuigi Rizzo TOK_DELAY, 187cc4d3c30SLuigi Rizzo TOK_PROFILE, 1886882bf4dSOleg Bulyzhin TOK_BURST, 1894e9c8ae7SLuigi Rizzo TOK_RED, 1904e9c8ae7SLuigi Rizzo TOK_GRED, 191fc5e1956SHiren Panchasara TOK_ECN, 1924e9c8ae7SLuigi Rizzo TOK_DROPTAIL, 1934e9c8ae7SLuigi Rizzo TOK_PROTO, 19491336b40SDon Lewis #ifdef NEW_AQM 19591336b40SDon Lewis /* AQM tokens*/ 19691336b40SDon Lewis TOK_NO_ECN, 19791336b40SDon Lewis TOK_CODEL, 19891336b40SDon Lewis TOK_FQ_CODEL, 19991336b40SDon Lewis TOK_TARGET, 20091336b40SDon Lewis TOK_INTERVAL, 20191336b40SDon Lewis TOK_FLOWS, 20291336b40SDon Lewis TOK_QUANTUM, 20391336b40SDon Lewis 20491336b40SDon Lewis TOK_PIE, 20591336b40SDon Lewis TOK_FQ_PIE, 20691336b40SDon Lewis TOK_TUPDATE, 20791336b40SDon Lewis TOK_MAX_BURST, 20891336b40SDon Lewis TOK_MAX_ECNTH, 20991336b40SDon Lewis TOK_ALPHA, 21091336b40SDon Lewis TOK_BETA, 21191336b40SDon Lewis TOK_CAPDROP, 21291336b40SDon Lewis TOK_NO_CAPDROP, 21391336b40SDon Lewis TOK_ONOFF, 21491336b40SDon Lewis TOK_DRE, 21591336b40SDon Lewis TOK_TS, 21691336b40SDon Lewis TOK_DERAND, 21791336b40SDon Lewis TOK_NO_DERAND, 21891336b40SDon Lewis #endif 219cc4d3c30SLuigi Rizzo /* dummynet tokens */ 2204e9c8ae7SLuigi Rizzo TOK_WEIGHT, 221cc4d3c30SLuigi Rizzo TOK_LMAX, 222cc4d3c30SLuigi Rizzo TOK_PRI, 223cc4d3c30SLuigi Rizzo TOK_TYPE, 224cc4d3c30SLuigi Rizzo TOK_SLOTSIZE, 225cc4d3c30SLuigi Rizzo 2264e9c8ae7SLuigi Rizzo TOK_IP, 2274e9c8ae7SLuigi Rizzo TOK_IF, 2284e9c8ae7SLuigi Rizzo TOK_ALOG, 2294e9c8ae7SLuigi Rizzo TOK_DENY_INC, 2304e9c8ae7SLuigi Rizzo TOK_SAME_PORTS, 2314e9c8ae7SLuigi Rizzo TOK_UNREG_ONLY, 23275b89337SAlexander V. Chernikov TOK_UNREG_CGN, 2331875bbfeSAndrey V. Elsukov TOK_SKIP_GLOBAL, 2344e9c8ae7SLuigi Rizzo TOK_RESET_ADDR, 2354e9c8ae7SLuigi Rizzo TOK_ALIAS_REV, 2364e9c8ae7SLuigi Rizzo TOK_PROXY_ONLY, 2374e9c8ae7SLuigi Rizzo TOK_REDIR_ADDR, 2384e9c8ae7SLuigi Rizzo TOK_REDIR_PORT, 2394e9c8ae7SLuigi Rizzo TOK_REDIR_PROTO, 2404e9c8ae7SLuigi Rizzo 2414e9c8ae7SLuigi Rizzo TOK_IPV6, 2424e9c8ae7SLuigi Rizzo TOK_FLOWID, 2434e9c8ae7SLuigi Rizzo TOK_ICMP6TYPES, 2444e9c8ae7SLuigi Rizzo TOK_EXT6HDR, 2454e9c8ae7SLuigi Rizzo TOK_DSTIP6, 2464e9c8ae7SLuigi Rizzo TOK_SRCIP6, 2474e9c8ae7SLuigi Rizzo 2484e9c8ae7SLuigi Rizzo TOK_IPV4, 2494e9c8ae7SLuigi Rizzo TOK_UNREACH6, 2504e9c8ae7SLuigi Rizzo TOK_RESET6, 2514e9c8ae7SLuigi Rizzo 2524e9c8ae7SLuigi Rizzo TOK_FIB, 2534e9c8ae7SLuigi Rizzo TOK_SETFIB, 254472099c4SLuigi Rizzo TOK_LOOKUP, 255ae99fd0eSLuigi Rizzo TOK_SOCKARG, 256ae01d73cSAlexander V. Chernikov TOK_SETDSCP, 257358b9d09SAlexander V. Chernikov TOK_FLOW, 258358b9d09SAlexander V. Chernikov TOK_IFLIST, 259ac35ff17SAlexander V. Chernikov /* Table tokens */ 260ac35ff17SAlexander V. Chernikov TOK_CREATE, 261ac35ff17SAlexander V. Chernikov TOK_DESTROY, 262ac35ff17SAlexander V. Chernikov TOK_LIST, 263ac35ff17SAlexander V. Chernikov TOK_INFO, 264358b9d09SAlexander V. Chernikov TOK_DETAIL, 265adf3b2b9SAlexander V. Chernikov TOK_MODIFY, 266ac35ff17SAlexander V. Chernikov TOK_FLUSH, 26746d52008SAlexander V. Chernikov TOK_SWAP, 268ac35ff17SAlexander V. Chernikov TOK_ADD, 269ac35ff17SAlexander V. Chernikov TOK_DEL, 270ac35ff17SAlexander V. Chernikov TOK_VALTYPE, 271ac35ff17SAlexander V. Chernikov TOK_ALGO, 272358b9d09SAlexander V. Chernikov TOK_TALIST, 2733a845e10SAlexander V. Chernikov TOK_ATOMIC, 2744f43138aSAlexander V. Chernikov TOK_LOCK, 2754f43138aSAlexander V. Chernikov TOK_UNLOCK, 2760cba2b28SAlexander V. Chernikov TOK_VLIST, 2775dc5a0e0SAndrey V. Elsukov TOK_OLIST, 27805ab1ef6SAndrey V. Elsukov TOK_MISSING, 27905ab1ef6SAndrey V. Elsukov TOK_ORFLUSH, 280d8caf56eSAndrey V. Elsukov 281d8caf56eSAndrey V. Elsukov /* NAT64 tokens */ 282d8caf56eSAndrey V. Elsukov TOK_NAT64STL, 283d8caf56eSAndrey V. Elsukov TOK_NAT64LSN, 284b867e84eSAndrey V. Elsukov TOK_STATS, 285d8caf56eSAndrey V. Elsukov TOK_STATES, 286d8caf56eSAndrey V. Elsukov TOK_CONFIG, 287d8caf56eSAndrey V. Elsukov TOK_TABLE4, 288d8caf56eSAndrey V. Elsukov TOK_TABLE6, 289d8caf56eSAndrey V. Elsukov TOK_PREFIX4, 290d8caf56eSAndrey V. Elsukov TOK_PREFIX6, 291d8caf56eSAndrey V. Elsukov TOK_AGG_LEN, 292d8caf56eSAndrey V. Elsukov TOK_AGG_COUNT, 293d8caf56eSAndrey V. Elsukov TOK_MAX_PORTS, 294d18c1f26SAndrey V. Elsukov TOK_STATES_CHUNKS, 295d8caf56eSAndrey V. Elsukov TOK_JMAXLEN, 296d8caf56eSAndrey V. Elsukov TOK_PORT_RANGE, 297a08cdb6cSNeel Chauhan TOK_PORT_ALIAS, 298d8caf56eSAndrey V. Elsukov TOK_HOST_DEL_AGE, 299d8caf56eSAndrey V. Elsukov TOK_PG_DEL_AGE, 300d8caf56eSAndrey V. Elsukov TOK_TCP_SYN_AGE, 301d8caf56eSAndrey V. Elsukov TOK_TCP_CLOSE_AGE, 302d8caf56eSAndrey V. Elsukov TOK_TCP_EST_AGE, 303d8caf56eSAndrey V. Elsukov TOK_UDP_AGE, 304d8caf56eSAndrey V. Elsukov TOK_ICMP_AGE, 305d8caf56eSAndrey V. Elsukov TOK_LOGOFF, 306b11efc1eSAndrey V. Elsukov TOK_PRIVATE, 307b11efc1eSAndrey V. Elsukov TOK_PRIVATEOFF, 308*4a77657cSAndrey V. Elsukov TOK_SWAPCONF, 309*4a77657cSAndrey V. Elsukov TOK_SWAPCONFOFF, 310b867e84eSAndrey V. Elsukov 3115c04f73eSAndrey V. Elsukov /* NAT64 CLAT tokens */ 3125c04f73eSAndrey V. Elsukov TOK_NAT64CLAT, 3135c04f73eSAndrey V. Elsukov TOK_PLAT_PREFIX, 3145c04f73eSAndrey V. Elsukov TOK_CLAT_PREFIX, 3155c04f73eSAndrey V. Elsukov 316b867e84eSAndrey V. Elsukov /* NPTv6 tokens */ 317b867e84eSAndrey V. Elsukov TOK_NPTV6, 318b867e84eSAndrey V. Elsukov TOK_INTPREFIX, 319b867e84eSAndrey V. Elsukov TOK_EXTPREFIX, 320b867e84eSAndrey V. Elsukov TOK_PREFIXLEN, 321b2b56606SAndrey V. Elsukov TOK_EXTIF, 322aac74aeaSAndrey V. Elsukov 323aac74aeaSAndrey V. Elsukov TOK_TCPSETMSS, 324f7c4fdeeSAndrey V. Elsukov 325fc727ad6SBoris Lytochkin TOK_MARK, 326fc727ad6SBoris Lytochkin TOK_SETMARK, 327fc727ad6SBoris Lytochkin 328f7c4fdeeSAndrey V. Elsukov TOK_SKIPACTION, 329b6c90b90SDamjan Jovanovic TOK_UDP_EIM, 3304e9c8ae7SLuigi Rizzo }; 3311940fa77SAlexander V. Chernikov 3323c0c8717SLuigi Rizzo /* 3333c0c8717SLuigi Rizzo * the following macro returns an error message if we run out of 3343c0c8717SLuigi Rizzo * arguments. 3353c0c8717SLuigi Rizzo */ 336cc4d3c30SLuigi Rizzo #define NEED(_p, msg) {if (!_p) errx(EX_USAGE, msg);} 337cc4d3c30SLuigi Rizzo #define NEED1(msg) {if (!(*av)) errx(EX_USAGE, msg);} 3383c0c8717SLuigi Rizzo 339563b5ab1SAlexander V. Chernikov struct buf_pr { 340563b5ab1SAlexander V. Chernikov char *buf; /* allocated buffer */ 341563b5ab1SAlexander V. Chernikov char *ptr; /* current pointer */ 342563b5ab1SAlexander V. Chernikov size_t size; /* total buffer size */ 343563b5ab1SAlexander V. Chernikov size_t avail; /* available storage */ 344563b5ab1SAlexander V. Chernikov size_t needed; /* length needed */ 345563b5ab1SAlexander V. Chernikov }; 346563b5ab1SAlexander V. Chernikov 347165236a1SMark Johnston int pr_u64(struct buf_pr *bp, void *pd, int width); 348563b5ab1SAlexander V. Chernikov int bp_alloc(struct buf_pr *b, size_t size); 349563b5ab1SAlexander V. Chernikov void bp_free(struct buf_pr *b); 35056707beeSMark Johnston int bprintf(struct buf_pr *b, const char *format, ...); 351563b5ab1SAlexander V. Chernikov 35250a99912SLuigi Rizzo 3533c0c8717SLuigi Rizzo /* memory allocation support */ 3543c0c8717SLuigi Rizzo void *safe_calloc(size_t number, size_t size); 3553c0c8717SLuigi Rizzo void *safe_realloc(void *ptr, size_t size); 3563c0c8717SLuigi Rizzo 357ead75a59SLuigi Rizzo /* string comparison functions used for historical compatibility */ 3583c0c8717SLuigi Rizzo int _substrcmp(const char *str1, const char* str2); 3594e9c8ae7SLuigi Rizzo int _substrcmp2(const char *str1, const char* str2, const char* str3); 36068394ec8SAlexander V. Chernikov int stringnum_cmp(const char *a, const char *b); 3614e9c8ae7SLuigi Rizzo 362ead75a59SLuigi Rizzo /* utility functions */ 3632acdf79fSAndrey V. Elsukov int match_token(struct _s_x *table, const char *string); 3642acdf79fSAndrey V. Elsukov int match_token_relaxed(struct _s_x *table, const char *string); 3652acdf79fSAndrey V. Elsukov int get_token(struct _s_x *table, const char *string, const char *errbase); 366ead75a59SLuigi Rizzo char const *match_value(struct _s_x *p, int value); 367ac35ff17SAlexander V. Chernikov size_t concat_tokens(char *buf, size_t bufsize, struct _s_x *table, 36856707beeSMark Johnston const char *delimiter); 3690cba2b28SAlexander V. Chernikov int fill_flags(struct _s_x *flags, char *p, char **e, uint32_t *set, 3700cba2b28SAlexander V. Chernikov uint32_t *clear); 3710cba2b28SAlexander V. Chernikov void print_flags_buffer(char *buf, size_t sz, struct _s_x *list, uint32_t set); 372ead75a59SLuigi Rizzo 373f1220db8SAlexander V. Chernikov struct _ip_fw3_opheader; 3744e9c8ae7SLuigi Rizzo int do_cmd(int optname, void *optval, uintptr_t optlen); 3756d3c367dSMarius Strobl int do_set3(int optname, struct _ip_fw3_opheader *op3, size_t optlen); 376f1220db8SAlexander V. Chernikov int do_get3(int optname, struct _ip_fw3_opheader *op3, size_t *optlen); 3771058f177SAlexander V. Chernikov 3784e9c8ae7SLuigi Rizzo struct in6_addr; 3794e9c8ae7SLuigi Rizzo void n2mask(struct in6_addr *mask, int n); 38056707beeSMark Johnston int contigmask(const uint8_t *p, int len); 381ead75a59SLuigi Rizzo 38216e3606fSLuigi Rizzo /* 38316e3606fSLuigi Rizzo * Forward declarations to avoid include way too many headers. 38416e3606fSLuigi Rizzo * C does not allow duplicated typedefs, so we use the base struct 38516e3606fSLuigi Rizzo * that the typedef points to. 38616e3606fSLuigi Rizzo * Should the typedefs use a different type, the compiler will 38716e3606fSLuigi Rizzo * still detect the change when compiling the body of the 38816e3606fSLuigi Rizzo * functions involved, so we do not lose error checking. 38916e3606fSLuigi Rizzo */ 39016e3606fSLuigi Rizzo struct _ipfw_insn; 39123c608c8SLuigi Rizzo struct _ipfw_insn_altq; 39216e3606fSLuigi Rizzo struct _ipfw_insn_u32; 39316e3606fSLuigi Rizzo struct _ipfw_insn_ip6; 39416e3606fSLuigi Rizzo struct _ipfw_insn_icmp6; 3953c0c8717SLuigi Rizzo 3963c0c8717SLuigi Rizzo /* 3973c0c8717SLuigi Rizzo * The reserved set numer. This is a constant in ip_fw.h 3983c0c8717SLuigi Rizzo * but we store it in a variable so other files do not depend 3993c0c8717SLuigi Rizzo * in that header just for one constant. 4003c0c8717SLuigi Rizzo */ 4013c0c8717SLuigi Rizzo extern int resvd_set_number; 4023c0c8717SLuigi Rizzo 403ead75a59SLuigi Rizzo /* first-level command handlers */ 404cc4d3c30SLuigi Rizzo void ipfw_add(char *av[]); 4053c0c8717SLuigi Rizzo void ipfw_show_nat(int ac, char **av); 406db1102f2SAndrey V. Elsukov int ipfw_delete_nat(int i); 4073c0c8717SLuigi Rizzo void ipfw_config_pipe(int ac, char **av); 4083c0c8717SLuigi Rizzo void ipfw_config_nat(int ac, char **av); 409cc4d3c30SLuigi Rizzo void ipfw_sets_handler(char *av[]); 4103c0c8717SLuigi Rizzo void ipfw_table_handler(int ac, char *av[]); 411cc4d3c30SLuigi Rizzo void ipfw_sysctl_handler(char *av[], int which); 412cc4d3c30SLuigi Rizzo void ipfw_delete(char *av[]); 4133c0c8717SLuigi Rizzo void ipfw_flush(int force); 4143c0c8717SLuigi Rizzo void ipfw_zero(int ac, char *av[], int optname); 4153c0c8717SLuigi Rizzo void ipfw_list(int ac, char *av[], int show_counters); 416358b9d09SAlexander V. Chernikov void ipfw_internal_handler(int ac, char *av[]); 4175c04f73eSAndrey V. Elsukov void ipfw_nat64clat_handler(int ac, char *av[]); 418d8caf56eSAndrey V. Elsukov void ipfw_nat64lsn_handler(int ac, char *av[]); 419d8caf56eSAndrey V. Elsukov void ipfw_nat64stl_handler(int ac, char *av[]); 420b867e84eSAndrey V. Elsukov void ipfw_nptv6_handler(int ac, char *av[]); 4212acdf79fSAndrey V. Elsukov int ipfw_check_object_name(const char *name); 422782360deSAndrey V. Elsukov int ipfw_check_nat64prefix(const struct in6_addr *prefix, int length); 4233c0c8717SLuigi Rizzo 4249968f056SGleb Smirnoff #ifdef PF 42523c608c8SLuigi Rizzo /* altq.c */ 42623c608c8SLuigi Rizzo void altq_set_enabled(int enabled); 42723c608c8SLuigi Rizzo u_int32_t altq_name_to_qid(const char *name); 42856707beeSMark Johnston void print_altq_cmd(struct buf_pr *bp, const struct _ipfw_insn_altq *altqptr); 4299968f056SGleb Smirnoff #else 4309968f056SGleb Smirnoff #define NO_ALTQ 4319968f056SGleb Smirnoff #endif 43223c608c8SLuigi Rizzo 433ead75a59SLuigi Rizzo /* dummynet.c */ 434cc4d3c30SLuigi Rizzo void dummynet_list(int ac, char *av[], int show_counters); 435cc4d3c30SLuigi Rizzo void dummynet_flush(void); 4364e9c8ae7SLuigi Rizzo int ipfw_delete_pipe(int pipe_or_queue, int n); 4374e9c8ae7SLuigi Rizzo 438ead75a59SLuigi Rizzo /* ipv6.c */ 4397b34dbe4SAndrey V. Elsukov void print_unreach6_code(struct buf_pr *bp, uint16_t code); 44056707beeSMark Johnston void print_ip6(struct buf_pr *bp, const struct _ipfw_insn_ip6 *cmd); 44156707beeSMark Johnston void print_flow6id(struct buf_pr *bp, const struct _ipfw_insn_u32 *cmd); 44256707beeSMark Johnston void print_icmp6types(struct buf_pr *bp, const struct _ipfw_insn_u32 *cmd); 44356707beeSMark Johnston void print_ext6hdr(struct buf_pr *bp, const struct _ipfw_insn *cmd); 444ead75a59SLuigi Rizzo 445757b5d87SAndrey V. Elsukov struct tidx; 446757b5d87SAndrey V. Elsukov struct _ipfw_insn *add_srcip6(struct _ipfw_insn *cmd, char *av, int cblen, 447757b5d87SAndrey V. Elsukov struct tidx *tstate); 448757b5d87SAndrey V. Elsukov struct _ipfw_insn *add_dstip6(struct _ipfw_insn *cmd, char *av, int cblen, 449757b5d87SAndrey V. Elsukov struct tidx *tstate); 450ead75a59SLuigi Rizzo 451579ed7bdSAlexander V. Chernikov void fill_flow6(struct _ipfw_insn_u32 *cmd, char *av, int cblen); 4522b5dd8b8SAlexander V. Chernikov uint16_t get_unreach6_code(const char *str); 453579ed7bdSAlexander V. Chernikov void fill_icmp6types(struct _ipfw_insn_icmp6 *cmd, char *av, int cblen); 45416e3606fSLuigi Rizzo int fill_ext6hdr(struct _ipfw_insn *cmd, char *av); 455563b5ab1SAlexander V. Chernikov 456b04471d8SCy Schubert /* ipfw2.c */ 457b04471d8SCy Schubert void bp_flush(struct buf_pr *b); 458757b5d87SAndrey V. Elsukov void fill_table(struct _ipfw_insn *cmd, char *av, uint8_t opcode, 459757b5d87SAndrey V. Elsukov struct tidx *tstate); 460b04471d8SCy Schubert 461563b5ab1SAlexander V. Chernikov /* tables.c */ 462563b5ab1SAlexander V. Chernikov struct _ipfw_obj_ctlv; 463d8caf56eSAndrey V. Elsukov struct _ipfw_obj_ntlv; 4642acdf79fSAndrey V. Elsukov int table_check_name(const char *tablename); 465358b9d09SAlexander V. Chernikov void ipfw_list_ta(int ac, char *av[]); 4660cba2b28SAlexander V. Chernikov void ipfw_list_values(int ac, char *av[]); 467d8caf56eSAndrey V. Elsukov void table_fill_ntlv(struct _ipfw_obj_ntlv *ntlv, const char *name, 468*4a77657cSAndrey V. Elsukov uint8_t set, uint32_t uidx); 469563b5ab1SAlexander V. Chernikov 470