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