17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate * Copyright (C) 1993-2001 by Darren Reed.
37c478bd9Sstevel@tonic-gate *
47c478bd9Sstevel@tonic-gate * See the IPFILTER.LICENCE file for details on licencing.
57c478bd9Sstevel@tonic-gate *
6*ab25eeb5Syz155240 * $Id: addicmp.c,v 1.10.2.1 2004/12/09 19:41:16 darrenr Exp $
77c478bd9Sstevel@tonic-gate */
87c478bd9Sstevel@tonic-gate
97c478bd9Sstevel@tonic-gate #include <ctype.h>
107c478bd9Sstevel@tonic-gate
117c478bd9Sstevel@tonic-gate #include "ipf.h"
127c478bd9Sstevel@tonic-gate
137c478bd9Sstevel@tonic-gate
147c478bd9Sstevel@tonic-gate char *icmptypes[MAX_ICMPTYPE + 1] = {
157c478bd9Sstevel@tonic-gate "echorep", (char *)NULL, (char *)NULL, "unreach", "squench",
167c478bd9Sstevel@tonic-gate "redir", (char *)NULL, (char *)NULL, "echo", "routerad",
177c478bd9Sstevel@tonic-gate "routersol", "timex", "paramprob", "timest", "timestrep",
187c478bd9Sstevel@tonic-gate "inforeq", "inforep", "maskreq", "maskrep", "END"
197c478bd9Sstevel@tonic-gate };
207c478bd9Sstevel@tonic-gate
217c478bd9Sstevel@tonic-gate /*
227c478bd9Sstevel@tonic-gate * set the icmp field to the correct type if "icmp" word is found
237c478bd9Sstevel@tonic-gate */
addicmp(cp,fp,linenum)247c478bd9Sstevel@tonic-gate int addicmp(cp, fp, linenum)
257c478bd9Sstevel@tonic-gate char ***cp;
267c478bd9Sstevel@tonic-gate struct frentry *fp;
277c478bd9Sstevel@tonic-gate int linenum;
287c478bd9Sstevel@tonic-gate {
297c478bd9Sstevel@tonic-gate char **t;
307c478bd9Sstevel@tonic-gate int i;
317c478bd9Sstevel@tonic-gate
327c478bd9Sstevel@tonic-gate (*cp)++;
337c478bd9Sstevel@tonic-gate if (!**cp)
347c478bd9Sstevel@tonic-gate return -1;
357c478bd9Sstevel@tonic-gate if (!fp->fr_proto) /* to catch lusers */
367c478bd9Sstevel@tonic-gate fp->fr_proto = IPPROTO_ICMP;
37*ab25eeb5Syz155240 if (ISDIGIT(***cp)) {
387c478bd9Sstevel@tonic-gate if (!ratoi(**cp, &i, 0, 255)) {
397c478bd9Sstevel@tonic-gate fprintf(stderr,
407c478bd9Sstevel@tonic-gate "%d: Invalid icmp-type (%s) specified\n",
417c478bd9Sstevel@tonic-gate linenum, **cp);
427c478bd9Sstevel@tonic-gate return -1;
437c478bd9Sstevel@tonic-gate }
447c478bd9Sstevel@tonic-gate } else {
457c478bd9Sstevel@tonic-gate for (t = icmptypes, i = 0; ; t++, i++) {
467c478bd9Sstevel@tonic-gate if (!*t)
477c478bd9Sstevel@tonic-gate continue;
487c478bd9Sstevel@tonic-gate if (!strcasecmp("END", *t)) {
497c478bd9Sstevel@tonic-gate i = -1;
507c478bd9Sstevel@tonic-gate break;
517c478bd9Sstevel@tonic-gate }
527c478bd9Sstevel@tonic-gate if (!strcasecmp(*t, **cp))
537c478bd9Sstevel@tonic-gate break;
547c478bd9Sstevel@tonic-gate }
557c478bd9Sstevel@tonic-gate if (i == -1) {
567c478bd9Sstevel@tonic-gate fprintf(stderr,
577c478bd9Sstevel@tonic-gate "%d: Unknown icmp-type (%s) specified\n",
587c478bd9Sstevel@tonic-gate linenum, **cp);
597c478bd9Sstevel@tonic-gate return -1;
607c478bd9Sstevel@tonic-gate }
617c478bd9Sstevel@tonic-gate }
627c478bd9Sstevel@tonic-gate fp->fr_icmp = (u_short)(i << 8);
637c478bd9Sstevel@tonic-gate fp->fr_icmpm = (u_short)0xff00;
647c478bd9Sstevel@tonic-gate (*cp)++;
657c478bd9Sstevel@tonic-gate if (!**cp)
667c478bd9Sstevel@tonic-gate return 0;
677c478bd9Sstevel@tonic-gate
687c478bd9Sstevel@tonic-gate if (**cp && strcasecmp("code", **cp))
697c478bd9Sstevel@tonic-gate return 0;
707c478bd9Sstevel@tonic-gate (*cp)++;
71*ab25eeb5Syz155240 if (ISDIGIT(***cp)) {
727c478bd9Sstevel@tonic-gate if (!ratoi(**cp, &i, 0, 255)) {
737c478bd9Sstevel@tonic-gate fprintf(stderr,
747c478bd9Sstevel@tonic-gate "%d: Invalid icmp code (%s) specified\n",
757c478bd9Sstevel@tonic-gate linenum, **cp);
767c478bd9Sstevel@tonic-gate return -1;
777c478bd9Sstevel@tonic-gate }
787c478bd9Sstevel@tonic-gate } else {
797c478bd9Sstevel@tonic-gate i = icmpcode(**cp);
807c478bd9Sstevel@tonic-gate if (i == -1) {
817c478bd9Sstevel@tonic-gate fprintf(stderr,
827c478bd9Sstevel@tonic-gate "%d: Unknown icmp code (%s) specified\n",
837c478bd9Sstevel@tonic-gate linenum, **cp);
847c478bd9Sstevel@tonic-gate return -1;
857c478bd9Sstevel@tonic-gate }
867c478bd9Sstevel@tonic-gate }
877c478bd9Sstevel@tonic-gate i &= 0xff;
887c478bd9Sstevel@tonic-gate fp->fr_icmp |= (u_short)i;
897c478bd9Sstevel@tonic-gate fp->fr_icmpm = (u_short)0xffff;
907c478bd9Sstevel@tonic-gate (*cp)++;
917c478bd9Sstevel@tonic-gate return 0;
927c478bd9Sstevel@tonic-gate }
93