1 /*
2 * Copyright (C) 1993-2001 by Darren Reed.
3 *
4 * See the IPFILTER.LICENCE file for details on licencing.
5 *
6 * $Id: extras.c,v 1.12 2002/07/13 12:06:49 darrenr Exp $
7 */
8
9 #include "ipf.h"
10
11
12 /*
13 * deal with extra bits on end of the line
14 */
extras(cp,fr,linenum)15 int extras(cp, fr, linenum)
16 char ***cp;
17 struct frentry *fr;
18 int linenum;
19 {
20 u_short secmsk;
21 u_long opts;
22 int notopt;
23
24 opts = 0;
25 secmsk = 0;
26 notopt = 0;
27 (*cp)++;
28 if (!**cp)
29 return -1;
30
31 while (**cp) {
32 if (!strcasecmp(**cp, "not") || !strcasecmp(**cp, "no")) {
33 notopt = 1;
34 (*cp)++;
35 continue;
36 } else if (!strncasecmp(**cp, "ipopt", 5)) {
37 if (!notopt)
38 fr->fr_flx |= FI_OPTIONS;
39 fr->fr_mflx |= FI_OPTIONS;
40 goto nextopt;
41 } else if (!strcasecmp(**cp, "lowttl")) {
42 if (!notopt)
43 fr->fr_flx |= FI_LOWTTL;
44 fr->fr_mflx |= FI_LOWTTL;
45 goto nextopt;
46 } else if (!strcasecmp(**cp, "bad-src")) {
47 if (!notopt)
48 fr->fr_flx |= FI_BADSRC;
49 fr->fr_mflx |= FI_BADSRC;
50 goto nextopt;
51 } else if (!strncasecmp(**cp, "mbcast", 6)) {
52 if (!notopt)
53 fr->fr_flx |= FI_MBCAST;
54 fr->fr_mflx |= FI_MBCAST;
55 goto nextopt;
56 } else if (!strncasecmp(**cp, "nat", 3)) {
57 if (!notopt)
58 fr->fr_flx |= FI_NATED;
59 fr->fr_mflx |= FI_NATED;
60 goto nextopt;
61 } else if (!strncasecmp(**cp, "frag", 4)) {
62 if (!notopt)
63 fr->fr_flx |= FI_FRAG;
64 fr->fr_mflx |= FI_FRAG;
65 goto nextopt;
66 } else if (!strncasecmp(**cp, "opt", 3)) {
67 if (!*(*cp + 1)) {
68 fprintf(stderr, "%d: opt missing arguements\n",
69 linenum);
70 return -1;
71 }
72 (*cp)++;
73 if (!(opts = optname(cp, &secmsk, linenum)))
74 return -1;
75
76 if (notopt) {
77 if (!secmsk) {
78 fr->fr_optmask |= opts;
79 } else {
80 fr->fr_optmask |= (opts & ~0x0100);
81 fr->fr_secmask |= secmsk;
82 }
83 fr->fr_secbits &= ~secmsk;
84 fr->fr_optbits &= ~opts;
85 } else {
86 fr->fr_optmask |= opts;
87 fr->fr_secmask |= secmsk;
88 fr->fr_optbits |= opts;
89 fr->fr_secbits |= secmsk;
90 }
91 } else if (!strncasecmp(**cp, "short", 5)) {
92 if (fr->fr_tcpf) {
93 fprintf(stderr,
94 "%d: short cannot be used with TCP flags\n",
95 linenum);
96 return -1;
97 }
98
99 if (!notopt)
100 fr->fr_flx |= FI_SHORT;
101 fr->fr_mflx |= FI_SHORT;
102 goto nextopt;
103 } else
104 return -1;
105 nextopt:
106 notopt = 0;
107 opts = 0;
108 secmsk = 0;
109 (*cp)++;
110 }
111 return 0;
112 }
113