xref: /freebsd/sbin/ipf/libipf/printipfexpr.c (revision 1d386b48a555f61cb7325543adbbb5c3f3407a66)
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
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
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
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
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
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