1#include "ipf.h"
2
3static void printport(int *);
4static void printhosts(int *);
5static void printsingle(int *);
6#ifdef USE_INET6
7static void printhostsv6(int *);
8#endif
9
10void
11printipfexpr(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
133static void
134printsingle(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
148static void
149printport(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
163static void
164printhosts(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
180static void
181printhostsv6(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