1 #include "ipf.h"
2
3 static void printport(int *);
4 static void printhosts(int *);
5 static void printsingle(int *);
6 #ifdef USE_INET6
7 static void printhostsv6(int *);
8 #endif
9
10 void
printipfexpr(int * array)11 printipfexpr(int *array)
12 {
13 int i, nelems, j, not;
14 ipfexp_t *ipfe;
15
16 nelems = array[0];
17
18 for (i = 1; i < nelems; ) {
19 ipfe = (ipfexp_t *)(array + i);
20 if (ipfe->ipfe_cmd == IPF_EXP_END)
21 break;
22
23 not = ipfe->ipfe_not;
24
25 switch (ipfe->ipfe_cmd)
26 {
27 case IPF_EXP_IP_ADDR :
28 PRINTF("ip.addr %s= ", not ? "!" : "");
29 printhosts(array + i);
30 break;
31
32 case IPF_EXP_IP_PR :
33 PRINTF("ip.p %s= ", not ? "!" : "");
34 printsingle(array + i);
35 break;
36
37 case IPF_EXP_IP_SRCADDR :
38 PRINTF("ip.src %s= ", not ? "!" : "");
39 printhosts(array + i);
40 break;
41
42 case IPF_EXP_IP_DSTADDR :
43 PRINTF("ip.dst %s= ", not ? "!" : "");
44 printhosts(array + i);
45 break;
46
47 case IPF_EXP_TCP_PORT :
48 PRINTF("tcp.port %s= ", not ? "!" : "");
49 printport(array + i);
50 break;
51
52 case IPF_EXP_TCP_DPORT :
53 PRINTF("tcp.dport %s= ", not ? "!" : "");
54 printport(array + i);
55 break;
56
57 case IPF_EXP_TCP_SPORT :
58 PRINTF("tcp.sport %s= ", not ? "!" : "");
59 printport(array + i);
60 break;
61
62 case IPF_EXP_TCP_FLAGS :
63 PRINTF("tcp.flags %s= ", not ? "!" : "");
64
65 for (j = 0; j < ipfe->ipfe_narg; ) {
66 printtcpflags(array[i + 4], array[i + 5]);
67 j += 2;
68 if (j < array[4])
69 putchar(',');
70 }
71 break;
72
73 case IPF_EXP_UDP_PORT :
74 PRINTF("udp.port %s= ", not ? "!" : "");
75 printport(array + i);
76 break;
77
78 case IPF_EXP_UDP_DPORT :
79 PRINTF("udp.dport %s= ", not ? "!" : "");
80 printport(array + i);
81 break;
82
83 case IPF_EXP_UDP_SPORT :
84 PRINTF("udp.sport %s= ", not ? "!" : "");
85 printport(array + i);
86 break;
87
88 case IPF_EXP_IDLE_GT :
89 PRINTF("idle-gt %s= ", not ? "!" : "");
90 printsingle(array + i);
91 break;
92
93 case IPF_EXP_TCP_STATE :
94 PRINTF("tcp-state %s= ", not ? "!" : "");
95 printsingle(array + i);
96 break;
97
98 #ifdef USE_INET6
99 case IPF_EXP_IP6_ADDR :
100 PRINTF("ip6.addr %s= ", not ? "!" : "");
101 printhostsv6(array + i);
102 break;
103
104 case IPF_EXP_IP6_SRCADDR :
105 PRINTF("ip6.src %s= ", not ? "!" : "");
106 printhostsv6(array + i);
107 break;
108
109 case IPF_EXP_IP6_DSTADDR :
110 PRINTF("ip6.dst %s= ", not ? "!" : "");
111 printhostsv6(array + i);
112 break;
113 #endif
114
115 case IPF_EXP_END :
116 break;
117
118 default :
119 PRINTF("#%#x,len=%d;",
120 ipfe->ipfe_cmd, ipfe->ipfe_narg);
121 }
122
123 if (array[i] != IPF_EXP_END)
124 putchar(';');
125
126 i += ipfe->ipfe_size;
127 if (array[i] != IPF_EXP_END)
128 putchar(' ');
129 }
130 }
131
132
133 static void
printsingle(int * array)134 printsingle(int *array)
135 {
136 ipfexp_t *ipfe = (ipfexp_t *)array;
137 int i;
138
139 for (i = 0; i < ipfe->ipfe_narg; ) {
140 PRINTF("%d", array[i + 4]);
141 i++;
142 if (i < ipfe->ipfe_narg)
143 putchar(',');
144 }
145 }
146
147
148 static void
printport(int * array)149 printport(int *array)
150 {
151 ipfexp_t *ipfe = (ipfexp_t *)array;
152 int i;
153
154 for (i = 0; i < ipfe->ipfe_narg; ) {
155 PRINTF("%d", ntohs(array[i + 4]));
156 i++;
157 if (i < ipfe->ipfe_narg)
158 putchar(',');
159 }
160 }
161
162
163 static void
printhosts(int * array)164 printhosts(int *array)
165 {
166 ipfexp_t *ipfe = (ipfexp_t *)array;
167 int i, j;
168
169 for (i = 0, j = 0; i < ipfe->ipfe_narg; j++) {
170 printhostmask(AF_INET, (u_32_t *)ipfe->ipfe_arg0 + j * 2,
171 (u_32_t *)ipfe->ipfe_arg0 + j * 2 + 1);
172 i += 2;
173 if (i < ipfe->ipfe_narg)
174 putchar(',');
175 }
176 }
177
178
179 #ifdef USE_INET6
180 static void
printhostsv6(int * array)181 printhostsv6(int *array)
182 {
183 ipfexp_t *ipfe = (ipfexp_t *)array;
184 int i, j;
185
186 for (i = 4, j= 0; i < ipfe->ipfe_size; j++) {
187 printhostmask(AF_INET6, (u_32_t *)ipfe->ipfe_arg0 + j * 8,
188 (u_32_t *)ipfe->ipfe_arg0 + j * 8 + 4);
189 i += 8;
190 if (i < ipfe->ipfe_size)
191 putchar(',');
192 }
193 }
194 #endif
195