1 /* 2 * Copyright (c) 2002-2003 Luigi Rizzo 3 * Copyright (c) 1996 Alex Nash, Paul Traina, Poul-Henning Kamp 4 * Copyright (c) 1994 Ugen J.S.Antsilevich 5 * 6 * Idea and grammar partially left from: 7 * Copyright (c) 1993 Daniel Boulet 8 * 9 * Redistribution and use in source forms, with and without modification, 10 * are permitted provided that this entire comment appears intact. 11 * 12 * Redistribution in binary form may occur without any restrictions. 13 * Obviously, it would be nice if you gave credit where credit is due 14 * but requiring it would be too onerous. 15 * 16 * This software is provided ``AS IS'' without any warranties of any kind. 17 * 18 * NEW command line interface for IP firewall facility 19 * 20 * $FreeBSD$ 21 */ 22 23 /* 24 * Options that can be set on the command line. 25 * When reading commands from a file, a subset of the options can also 26 * be applied globally by specifying them before the file name. 27 * After that, each line can contain its own option that changes 28 * the global value. 29 * XXX The context is not restored after each line. 30 */ 31 32 struct cmdline_opts { 33 /* boolean options: */ 34 int do_value_as_ip; /* show table value as IP */ 35 int do_resolv; /* try to resolve all ip to names */ 36 int do_time; /* Show time stamps */ 37 int do_quiet; /* Be quiet in add and flush */ 38 int do_pipe; /* this cmd refers to a pipe/queue/sched */ 39 int do_nat; /* this cmd refers to a nat config */ 40 int do_dynamic; /* display dynamic rules */ 41 int do_expired; /* display expired dynamic rules */ 42 int do_compact; /* show rules in compact mode */ 43 int do_force; /* do not ask for confirmation */ 44 int show_sets; /* display the set each rule belongs to */ 45 int test_only; /* only check syntax */ 46 int comment_only; /* only print action and comment */ 47 int verbose; /* be verbose on some commands */ 48 49 /* The options below can have multiple values. */ 50 51 int do_sort; /* field to sort results (0 = no) */ 52 /* valid fields are 1 and above */ 53 54 int use_set; /* work with specified set number */ 55 /* 0 means all sets, otherwise apply to set use_set - 1 */ 56 57 }; 58 59 extern struct cmdline_opts co; 60 61 /* 62 * _s_x is a structure that stores a string <-> token pairs, used in 63 * various places in the parser. Entries are stored in arrays, 64 * with an entry with s=NULL as terminator. 65 * The search routines are match_token() and match_value(). 66 * Often, an element with x=0 contains an error string. 67 * 68 */ 69 struct _s_x { 70 char const *s; 71 int x; 72 }; 73 74 extern struct _s_x f_ipdscp[]; 75 76 enum tokens { 77 TOK_NULL=0, 78 79 TOK_OR, 80 TOK_NOT, 81 TOK_STARTBRACE, 82 TOK_ENDBRACE, 83 84 TOK_ACCEPT, 85 TOK_COUNT, 86 TOK_EACTION, 87 TOK_PIPE, 88 TOK_LINK, 89 TOK_QUEUE, 90 TOK_FLOWSET, 91 TOK_SCHED, 92 TOK_DIVERT, 93 TOK_TEE, 94 TOK_NETGRAPH, 95 TOK_NGTEE, 96 TOK_FORWARD, 97 TOK_SKIPTO, 98 TOK_DENY, 99 TOK_REJECT, 100 TOK_RESET, 101 TOK_UNREACH, 102 TOK_CHECKSTATE, 103 TOK_NAT, 104 TOK_REASS, 105 TOK_CALL, 106 TOK_RETURN, 107 108 TOK_ALTQ, 109 TOK_LOG, 110 TOK_TAG, 111 TOK_UNTAG, 112 113 TOK_TAGGED, 114 TOK_UID, 115 TOK_GID, 116 TOK_JAIL, 117 TOK_IN, 118 TOK_LIMIT, 119 TOK_KEEPSTATE, 120 TOK_LAYER2, 121 TOK_OUT, 122 TOK_DIVERTED, 123 TOK_DIVERTEDLOOPBACK, 124 TOK_DIVERTEDOUTPUT, 125 TOK_XMIT, 126 TOK_RECV, 127 TOK_VIA, 128 TOK_FRAG, 129 TOK_IPOPTS, 130 TOK_IPLEN, 131 TOK_IPID, 132 TOK_IPPRECEDENCE, 133 TOK_DSCP, 134 TOK_IPTOS, 135 TOK_IPTTL, 136 TOK_IPVER, 137 TOK_ESTAB, 138 TOK_SETUP, 139 TOK_TCPDATALEN, 140 TOK_TCPFLAGS, 141 TOK_TCPOPTS, 142 TOK_TCPSEQ, 143 TOK_TCPACK, 144 TOK_TCPWIN, 145 TOK_ICMPTYPES, 146 TOK_MAC, 147 TOK_MACTYPE, 148 TOK_VERREVPATH, 149 TOK_VERSRCREACH, 150 TOK_ANTISPOOF, 151 TOK_IPSEC, 152 TOK_COMMENT, 153 154 TOK_PLR, 155 TOK_NOERROR, 156 TOK_BUCKETS, 157 TOK_DSTIP, 158 TOK_SRCIP, 159 TOK_DSTPORT, 160 TOK_SRCPORT, 161 TOK_ALL, 162 TOK_MASK, 163 TOK_FLOW_MASK, 164 TOK_SCHED_MASK, 165 TOK_BW, 166 TOK_DELAY, 167 TOK_PROFILE, 168 TOK_BURST, 169 TOK_RED, 170 TOK_GRED, 171 TOK_ECN, 172 TOK_DROPTAIL, 173 TOK_PROTO, 174 /* dummynet tokens */ 175 TOK_WEIGHT, 176 TOK_LMAX, 177 TOK_PRI, 178 TOK_TYPE, 179 TOK_SLOTSIZE, 180 181 TOK_IP, 182 TOK_IF, 183 TOK_ALOG, 184 TOK_DENY_INC, 185 TOK_SAME_PORTS, 186 TOK_UNREG_ONLY, 187 TOK_SKIP_GLOBAL, 188 TOK_RESET_ADDR, 189 TOK_ALIAS_REV, 190 TOK_PROXY_ONLY, 191 TOK_REDIR_ADDR, 192 TOK_REDIR_PORT, 193 TOK_REDIR_PROTO, 194 195 TOK_IPV6, 196 TOK_FLOWID, 197 TOK_ICMP6TYPES, 198 TOK_EXT6HDR, 199 TOK_DSTIP6, 200 TOK_SRCIP6, 201 202 TOK_IPV4, 203 TOK_UNREACH6, 204 TOK_RESET6, 205 206 TOK_FIB, 207 TOK_SETFIB, 208 TOK_LOOKUP, 209 TOK_SOCKARG, 210 TOK_SETDSCP, 211 TOK_FLOW, 212 TOK_IFLIST, 213 /* Table tokens */ 214 TOK_CREATE, 215 TOK_DESTROY, 216 TOK_LIST, 217 TOK_INFO, 218 TOK_DETAIL, 219 TOK_MODIFY, 220 TOK_FLUSH, 221 TOK_SWAP, 222 TOK_ADD, 223 TOK_DEL, 224 TOK_VALTYPE, 225 TOK_ALGO, 226 TOK_TALIST, 227 TOK_ATOMIC, 228 TOK_LOCK, 229 TOK_UNLOCK, 230 TOK_VLIST, 231 TOK_OLIST, 232 }; 233 234 /* 235 * the following macro returns an error message if we run out of 236 * arguments. 237 */ 238 #define NEED(_p, msg) {if (!_p) errx(EX_USAGE, msg);} 239 #define NEED1(msg) {if (!(*av)) errx(EX_USAGE, msg);} 240 241 struct buf_pr { 242 char *buf; /* allocated buffer */ 243 char *ptr; /* current pointer */ 244 size_t size; /* total buffer size */ 245 size_t avail; /* available storage */ 246 size_t needed; /* length needed */ 247 }; 248 249 int pr_u64(struct buf_pr *bp, uint64_t *pd, int width); 250 int bp_alloc(struct buf_pr *b, size_t size); 251 void bp_free(struct buf_pr *b); 252 int bprintf(struct buf_pr *b, char *format, ...); 253 254 255 /* memory allocation support */ 256 void *safe_calloc(size_t number, size_t size); 257 void *safe_realloc(void *ptr, size_t size); 258 259 /* string comparison functions used for historical compatibility */ 260 int _substrcmp(const char *str1, const char* str2); 261 int _substrcmp2(const char *str1, const char* str2, const char* str3); 262 int stringnum_cmp(const char *a, const char *b); 263 264 /* utility functions */ 265 int match_token(struct _s_x *table, const char *string); 266 int match_token_relaxed(struct _s_x *table, const char *string); 267 int get_token(struct _s_x *table, const char *string, const char *errbase); 268 char const *match_value(struct _s_x *p, int value); 269 size_t concat_tokens(char *buf, size_t bufsize, struct _s_x *table, 270 char *delimiter); 271 int fill_flags(struct _s_x *flags, char *p, char **e, uint32_t *set, 272 uint32_t *clear); 273 void print_flags_buffer(char *buf, size_t sz, struct _s_x *list, uint32_t set); 274 275 struct _ip_fw3_opheader; 276 int do_cmd(int optname, void *optval, uintptr_t optlen); 277 int do_set3(int optname, struct _ip_fw3_opheader *op3, uintptr_t optlen); 278 int do_get3(int optname, struct _ip_fw3_opheader *op3, size_t *optlen); 279 280 struct in6_addr; 281 void n2mask(struct in6_addr *mask, int n); 282 int contigmask(uint8_t *p, int len); 283 284 /* 285 * Forward declarations to avoid include way too many headers. 286 * C does not allow duplicated typedefs, so we use the base struct 287 * that the typedef points to. 288 * Should the typedefs use a different type, the compiler will 289 * still detect the change when compiling the body of the 290 * functions involved, so we do not lose error checking. 291 */ 292 struct _ipfw_insn; 293 struct _ipfw_insn_altq; 294 struct _ipfw_insn_u32; 295 struct _ipfw_insn_ip6; 296 struct _ipfw_insn_icmp6; 297 298 /* 299 * The reserved set numer. This is a constant in ip_fw.h 300 * but we store it in a variable so other files do not depend 301 * in that header just for one constant. 302 */ 303 extern int resvd_set_number; 304 305 /* first-level command handlers */ 306 void ipfw_add(char *av[]); 307 void ipfw_show_nat(int ac, char **av); 308 void ipfw_config_pipe(int ac, char **av); 309 void ipfw_config_nat(int ac, char **av); 310 void ipfw_sets_handler(char *av[]); 311 void ipfw_table_handler(int ac, char *av[]); 312 void ipfw_sysctl_handler(char *av[], int which); 313 void ipfw_delete(char *av[]); 314 void ipfw_flush(int force); 315 void ipfw_zero(int ac, char *av[], int optname); 316 void ipfw_list(int ac, char *av[], int show_counters); 317 void ipfw_internal_handler(int ac, char *av[]); 318 int ipfw_check_object_name(const char *name); 319 320 #ifdef PF 321 /* altq.c */ 322 void altq_set_enabled(int enabled); 323 u_int32_t altq_name_to_qid(const char *name); 324 void print_altq_cmd(struct buf_pr *bp, struct _ipfw_insn_altq *altqptr); 325 #else 326 #define NO_ALTQ 327 #endif 328 329 /* dummynet.c */ 330 void dummynet_list(int ac, char *av[], int show_counters); 331 void dummynet_flush(void); 332 int ipfw_delete_pipe(int pipe_or_queue, int n); 333 334 /* ipv6.c */ 335 void print_unreach6_code(struct buf_pr *bp, uint16_t code); 336 void print_ip6(struct buf_pr *bp, struct _ipfw_insn_ip6 *cmd, char const *s); 337 void print_flow6id(struct buf_pr *bp, struct _ipfw_insn_u32 *cmd); 338 void print_icmp6types(struct buf_pr *bp, struct _ipfw_insn_u32 *cmd); 339 void print_ext6hdr(struct buf_pr *bp, struct _ipfw_insn *cmd ); 340 341 struct _ipfw_insn *add_srcip6(struct _ipfw_insn *cmd, char *av, int cblen); 342 struct _ipfw_insn *add_dstip6(struct _ipfw_insn *cmd, char *av, int cblen); 343 344 void fill_flow6(struct _ipfw_insn_u32 *cmd, char *av, int cblen); 345 void fill_unreach6_code(u_short *codep, char *str); 346 void fill_icmp6types(struct _ipfw_insn_icmp6 *cmd, char *av, int cblen); 347 int fill_ext6hdr(struct _ipfw_insn *cmd, char *av); 348 349 /* tables.c */ 350 struct _ipfw_obj_ctlv; 351 int table_check_name(const char *tablename); 352 void ipfw_list_ta(int ac, char *av[]); 353 void ipfw_list_values(int ac, char *av[]); 354 355