1 /* 2 * Copyright (C) 1993-2001 by Darren Reed. 3 * 4 * See the IPFILTER.LICENCE file for details on licencing. 5 * 6 * $Id: addicmp.c,v 1.8 2002/01/28 06:50:45 darrenr Exp $ 7 */ 8 9 #include <ctype.h> 10 11 #include "ipf.h" 12 13 14 char *icmptypes[MAX_ICMPTYPE + 1] = { 15 "echorep", (char *)NULL, (char *)NULL, "unreach", "squench", 16 "redir", (char *)NULL, (char *)NULL, "echo", "routerad", 17 "routersol", "timex", "paramprob", "timest", "timestrep", 18 "inforeq", "inforep", "maskreq", "maskrep", "END" 19 }; 20 21 /* 22 * set the icmp field to the correct type if "icmp" word is found 23 */ 24 int addicmp(cp, fp, linenum) 25 char ***cp; 26 struct frentry *fp; 27 int linenum; 28 { 29 char **t; 30 int i; 31 32 (*cp)++; 33 if (!**cp) 34 return -1; 35 if (!fp->fr_proto) /* to catch lusers */ 36 fp->fr_proto = IPPROTO_ICMP; 37 if (isdigit(***cp)) { 38 if (!ratoi(**cp, &i, 0, 255)) { 39 fprintf(stderr, 40 "%d: Invalid icmp-type (%s) specified\n", 41 linenum, **cp); 42 return -1; 43 } 44 } else { 45 for (t = icmptypes, i = 0; ; t++, i++) { 46 if (!*t) 47 continue; 48 if (!strcasecmp("END", *t)) { 49 i = -1; 50 break; 51 } 52 if (!strcasecmp(*t, **cp)) 53 break; 54 } 55 if (i == -1) { 56 fprintf(stderr, 57 "%d: Unknown icmp-type (%s) specified\n", 58 linenum, **cp); 59 return -1; 60 } 61 } 62 fp->fr_icmp = (u_short)(i << 8); 63 fp->fr_icmpm = (u_short)0xff00; 64 (*cp)++; 65 if (!**cp) 66 return 0; 67 68 if (**cp && strcasecmp("code", **cp)) 69 return 0; 70 (*cp)++; 71 if (isdigit(***cp)) { 72 if (!ratoi(**cp, &i, 0, 255)) { 73 fprintf(stderr, 74 "%d: Invalid icmp code (%s) specified\n", 75 linenum, **cp); 76 return -1; 77 } 78 } else { 79 i = icmpcode(**cp); 80 if (i == -1) { 81 fprintf(stderr, 82 "%d: Unknown icmp code (%s) specified\n", 83 linenum, **cp); 84 return -1; 85 } 86 } 87 i &= 0xff; 88 fp->fr_icmp |= (u_short)i; 89 fp->fr_icmpm = (u_short)0xffff; 90 (*cp)++; 91 return 0; 92 } 93