10Sstevel@tonic-gate /* 20Sstevel@tonic-gate * Copyright (C) 1993-2001 by Darren Reed. 30Sstevel@tonic-gate * 40Sstevel@tonic-gate * See the IPFILTER.LICENCE file for details on licencing. 50Sstevel@tonic-gate * 6*2393Syz155240 * $Id: addicmp.c,v 1.10.2.1 2004/12/09 19:41:16 darrenr Exp $ 70Sstevel@tonic-gate */ 80Sstevel@tonic-gate 90Sstevel@tonic-gate #include <ctype.h> 100Sstevel@tonic-gate 110Sstevel@tonic-gate #include "ipf.h" 120Sstevel@tonic-gate 130Sstevel@tonic-gate 140Sstevel@tonic-gate char *icmptypes[MAX_ICMPTYPE + 1] = { 150Sstevel@tonic-gate "echorep", (char *)NULL, (char *)NULL, "unreach", "squench", 160Sstevel@tonic-gate "redir", (char *)NULL, (char *)NULL, "echo", "routerad", 170Sstevel@tonic-gate "routersol", "timex", "paramprob", "timest", "timestrep", 180Sstevel@tonic-gate "inforeq", "inforep", "maskreq", "maskrep", "END" 190Sstevel@tonic-gate }; 200Sstevel@tonic-gate 210Sstevel@tonic-gate /* 220Sstevel@tonic-gate * set the icmp field to the correct type if "icmp" word is found 230Sstevel@tonic-gate */ 240Sstevel@tonic-gate int addicmp(cp, fp, linenum) 250Sstevel@tonic-gate char ***cp; 260Sstevel@tonic-gate struct frentry *fp; 270Sstevel@tonic-gate int linenum; 280Sstevel@tonic-gate { 290Sstevel@tonic-gate char **t; 300Sstevel@tonic-gate int i; 310Sstevel@tonic-gate 320Sstevel@tonic-gate (*cp)++; 330Sstevel@tonic-gate if (!**cp) 340Sstevel@tonic-gate return -1; 350Sstevel@tonic-gate if (!fp->fr_proto) /* to catch lusers */ 360Sstevel@tonic-gate fp->fr_proto = IPPROTO_ICMP; 37*2393Syz155240 if (ISDIGIT(***cp)) { 380Sstevel@tonic-gate if (!ratoi(**cp, &i, 0, 255)) { 390Sstevel@tonic-gate fprintf(stderr, 400Sstevel@tonic-gate "%d: Invalid icmp-type (%s) specified\n", 410Sstevel@tonic-gate linenum, **cp); 420Sstevel@tonic-gate return -1; 430Sstevel@tonic-gate } 440Sstevel@tonic-gate } else { 450Sstevel@tonic-gate for (t = icmptypes, i = 0; ; t++, i++) { 460Sstevel@tonic-gate if (!*t) 470Sstevel@tonic-gate continue; 480Sstevel@tonic-gate if (!strcasecmp("END", *t)) { 490Sstevel@tonic-gate i = -1; 500Sstevel@tonic-gate break; 510Sstevel@tonic-gate } 520Sstevel@tonic-gate if (!strcasecmp(*t, **cp)) 530Sstevel@tonic-gate break; 540Sstevel@tonic-gate } 550Sstevel@tonic-gate if (i == -1) { 560Sstevel@tonic-gate fprintf(stderr, 570Sstevel@tonic-gate "%d: Unknown icmp-type (%s) specified\n", 580Sstevel@tonic-gate linenum, **cp); 590Sstevel@tonic-gate return -1; 600Sstevel@tonic-gate } 610Sstevel@tonic-gate } 620Sstevel@tonic-gate fp->fr_icmp = (u_short)(i << 8); 630Sstevel@tonic-gate fp->fr_icmpm = (u_short)0xff00; 640Sstevel@tonic-gate (*cp)++; 650Sstevel@tonic-gate if (!**cp) 660Sstevel@tonic-gate return 0; 670Sstevel@tonic-gate 680Sstevel@tonic-gate if (**cp && strcasecmp("code", **cp)) 690Sstevel@tonic-gate return 0; 700Sstevel@tonic-gate (*cp)++; 71*2393Syz155240 if (ISDIGIT(***cp)) { 720Sstevel@tonic-gate if (!ratoi(**cp, &i, 0, 255)) { 73*2393Syz155240 fprintf(stderr, 740Sstevel@tonic-gate "%d: Invalid icmp code (%s) specified\n", 750Sstevel@tonic-gate linenum, **cp); 760Sstevel@tonic-gate return -1; 770Sstevel@tonic-gate } 780Sstevel@tonic-gate } else { 790Sstevel@tonic-gate i = icmpcode(**cp); 800Sstevel@tonic-gate if (i == -1) { 81*2393Syz155240 fprintf(stderr, 820Sstevel@tonic-gate "%d: Unknown icmp code (%s) specified\n", 830Sstevel@tonic-gate linenum, **cp); 840Sstevel@tonic-gate return -1; 850Sstevel@tonic-gate } 860Sstevel@tonic-gate } 870Sstevel@tonic-gate i &= 0xff; 880Sstevel@tonic-gate fp->fr_icmp |= (u_short)i; 890Sstevel@tonic-gate fp->fr_icmpm = (u_short)0xffff; 900Sstevel@tonic-gate (*cp)++; 910Sstevel@tonic-gate return 0; 920Sstevel@tonic-gate } 93