1254219Scy#include "ipf.h" 2254219Scy 3254219Scystatic void printport __P((int *)); 4254219Scystatic void printhosts __P((int *)); 5254219Scystatic void printsingle __P((int *)); 6268937Scy#ifdef USE_INET6 7254219Scystatic void printhostsv6 __P((int *)); 8268937Scy#endif 9254219Scy 10254219Scyvoid 11254219Scyprintipfexpr(array) 12254219Scy int *array; 13254219Scy{ 14254219Scy int i, nelems, j, not; 15254219Scy ipfexp_t *ipfe; 16254219Scy 17254219Scy nelems = array[0]; 18254219Scy 19254219Scy for (i = 1; i < nelems; ) { 20254219Scy ipfe = (ipfexp_t *)(array + i); 21254219Scy if (ipfe->ipfe_cmd == IPF_EXP_END) 22254219Scy break; 23254219Scy 24254219Scy not = ipfe->ipfe_not; 25254219Scy 26254219Scy switch (ipfe->ipfe_cmd) 27254219Scy { 28254219Scy case IPF_EXP_IP_ADDR : 29254219Scy PRINTF("ip.addr %s= ", not ? "!" : ""); 30254219Scy printhosts(array + i); 31254219Scy break; 32254219Scy 33254219Scy case IPF_EXP_IP_PR : 34254219Scy PRINTF("ip.p %s= ", not ? "!" : ""); 35254219Scy printsingle(array + i); 36254219Scy break; 37254219Scy 38254219Scy case IPF_EXP_IP_SRCADDR : 39254219Scy PRINTF("ip.src %s= ", not ? "!" : ""); 40254219Scy printhosts(array + i); 41254219Scy break; 42254219Scy 43254219Scy case IPF_EXP_IP_DSTADDR : 44254219Scy PRINTF("ip.dst %s= ", not ? "!" : ""); 45254219Scy printhosts(array + i); 46254219Scy break; 47254219Scy 48254219Scy case IPF_EXP_TCP_PORT : 49254219Scy PRINTF("tcp.port %s= ", not ? "!" : ""); 50254219Scy printport(array + i); 51254219Scy break; 52254219Scy 53254219Scy case IPF_EXP_TCP_DPORT : 54254219Scy PRINTF("tcp.dport %s= ", not ? "!" : ""); 55254219Scy printport(array + i); 56254219Scy break; 57254219Scy 58254219Scy case IPF_EXP_TCP_SPORT : 59254219Scy PRINTF("tcp.sport %s= ", not ? "!" : ""); 60254219Scy printport(array + i); 61254219Scy break; 62254219Scy 63254219Scy case IPF_EXP_TCP_FLAGS : 64254219Scy PRINTF("tcp.flags %s= ", not ? "!" : ""); 65254219Scy 66254219Scy for (j = 0; j < ipfe->ipfe_narg; ) { 67254219Scy printtcpflags(array[i + 4], array[i + 5]); 68254219Scy j += 2; 69254219Scy if (j < array[4]) 70254219Scy putchar(','); 71254219Scy } 72254219Scy break; 73254219Scy 74254219Scy case IPF_EXP_UDP_PORT : 75254219Scy PRINTF("udp.port %s= ", not ? "!" : ""); 76254219Scy printport(array + i); 77254219Scy break; 78254219Scy 79254219Scy case IPF_EXP_UDP_DPORT : 80254219Scy PRINTF("udp.dport %s= ", not ? "!" : ""); 81254219Scy printport(array + i); 82254219Scy break; 83254219Scy 84254219Scy case IPF_EXP_UDP_SPORT : 85254219Scy PRINTF("udp.sport %s= ", not ? "!" : ""); 86254219Scy printport(array + i); 87254219Scy break; 88254219Scy 89254219Scy case IPF_EXP_IDLE_GT : 90254219Scy PRINTF("idle-gt %s= ", not ? "!" : ""); 91254219Scy printsingle(array + i); 92254219Scy break; 93254219Scy 94254219Scy case IPF_EXP_TCP_STATE : 95254219Scy PRINTF("tcp-state %s= ", not ? "!" : ""); 96254219Scy printsingle(array + i); 97254219Scy break; 98254219Scy 99254219Scy#ifdef USE_INET6 100254219Scy case IPF_EXP_IP6_ADDR : 101254219Scy PRINTF("ip6.addr %s= ", not ? "!" : ""); 102254219Scy printhostsv6(array + i); 103254219Scy break; 104254219Scy 105254219Scy case IPF_EXP_IP6_SRCADDR : 106254219Scy PRINTF("ip6.src %s= ", not ? "!" : ""); 107254219Scy printhostsv6(array + i); 108254219Scy break; 109254219Scy 110254219Scy case IPF_EXP_IP6_DSTADDR : 111254219Scy PRINTF("ip6.dst %s= ", not ? "!" : ""); 112254219Scy printhostsv6(array + i); 113254219Scy break; 114254219Scy#endif 115254219Scy 116254219Scy case IPF_EXP_END : 117254219Scy break; 118254219Scy 119254219Scy default : 120254219Scy PRINTF("#%#x,len=%d;", 121254219Scy ipfe->ipfe_cmd, ipfe->ipfe_narg); 122254219Scy } 123254219Scy 124254219Scy if (array[i] != IPF_EXP_END) 125254219Scy putchar(';'); 126254219Scy 127254219Scy i += ipfe->ipfe_size; 128254219Scy if (array[i] != IPF_EXP_END) 129254219Scy putchar(' '); 130254219Scy } 131254219Scy} 132254219Scy 133254219Scy 134254219Scystatic void 135254219Scyprintsingle(array) 136254219Scy int *array; 137254219Scy{ 138254219Scy ipfexp_t *ipfe = (ipfexp_t *)array; 139254219Scy int i; 140254219Scy 141254219Scy for (i = 0; i < ipfe->ipfe_narg; ) { 142254219Scy PRINTF("%d", array[i + 4]); 143254219Scy i++; 144254219Scy if (i < ipfe->ipfe_narg) 145254219Scy putchar(','); 146254219Scy } 147254219Scy} 148254219Scy 149254219Scy 150254219Scystatic void 151254219Scyprintport(array) 152254219Scy int *array; 153254219Scy{ 154254219Scy ipfexp_t *ipfe = (ipfexp_t *)array; 155254219Scy int i; 156254219Scy 157254219Scy for (i = 0; i < ipfe->ipfe_narg; ) { 158254219Scy PRINTF("%d", ntohs(array[i + 4])); 159254219Scy i++; 160254219Scy if (i < ipfe->ipfe_narg) 161254219Scy putchar(','); 162254219Scy } 163254219Scy} 164254219Scy 165254219Scy 166254219Scystatic void 167254219Scyprinthosts(array) 168254219Scy int *array; 169254219Scy{ 170254219Scy ipfexp_t *ipfe = (ipfexp_t *)array; 171254219Scy int i, j; 172254219Scy 173254219Scy for (i = 0, j = 0; i < ipfe->ipfe_narg; j++) { 174254219Scy printhostmask(AF_INET, (u_32_t *)ipfe->ipfe_arg0 + j * 2, 175254219Scy (u_32_t *)ipfe->ipfe_arg0 + j * 2 + 1); 176254219Scy i += 2; 177254219Scy if (i < ipfe->ipfe_narg) 178254219Scy putchar(','); 179254219Scy } 180254219Scy} 181254219Scy 182254219Scy 183254219Scy#ifdef USE_INET6 184254219Scystatic void 185254219Scyprinthostsv6(array) 186254219Scy int *array; 187254219Scy{ 188254219Scy ipfexp_t *ipfe = (ipfexp_t *)array; 189254219Scy int i, j; 190254219Scy 191254219Scy for (i = 4, j= 0; i < ipfe->ipfe_size; j++) { 192254219Scy printhostmask(AF_INET6, (u_32_t *)ipfe->ipfe_arg0 + j * 8, 193254219Scy (u_32_t *)ipfe->ipfe_arg0 + j * 8 + 4); 194254219Scy i += 8; 195254219Scy if (i < ipfe->ipfe_size) 196254219Scy putchar(','); 197254219Scy } 198254219Scy} 199254219Scy#endif 200