xref: /netbsd-src/external/bsd/ipf/dist/lib/printhashnode.c (revision b757af438b42b93f8c6571f026d8b8ef3eaf5fc9)
1 /*	$NetBSD: printhashnode.c,v 1.1.1.1 2012/03/23 21:20:09 christos Exp $	*/
2 
3 /*
4  * Copyright (C) 2012 by Darren Reed.
5  *
6  * See the IPFILTER.LICENCE file for details on licencing.
7  */
8 
9 #include "ipf.h"
10 
11 
12 iphtent_t *
13 printhashnode(iph, ipep, copyfunc, opts, fields)
14 	iphtable_t *iph;
15 	iphtent_t *ipep;
16 	copyfunc_t copyfunc;
17 	int opts;
18 	wordtab_t *fields;
19 {
20 	iphtent_t ipe;
21 	u_int hv;
22 	int i;
23 
24 	if ((*copyfunc)(ipep, &ipe, sizeof(ipe)))
25 		return NULL;
26 
27 	hv = IPE_V4_HASH_FN(ipe.ipe_addr.i6[0], ipe.ipe_mask.i6[0],
28 			    iph->iph_size);
29 	ipe.ipe_addr.i6[0] = htonl(ipe.ipe_addr.i6[0]);
30 	ipe.ipe_addr.i6[1] = htonl(ipe.ipe_addr.i6[1]);
31 	ipe.ipe_addr.i6[2] = htonl(ipe.ipe_addr.i6[2]);
32 	ipe.ipe_addr.i6[3] = htonl(ipe.ipe_addr.i6[3]);
33 	ipe.ipe_mask.i6[0] = htonl(ipe.ipe_mask.i6[0]);
34 	ipe.ipe_mask.i6[1] = htonl(ipe.ipe_mask.i6[1]);
35 	ipe.ipe_mask.i6[2] = htonl(ipe.ipe_mask.i6[2]);
36 	ipe.ipe_mask.i6[3] = htonl(ipe.ipe_mask.i6[3]);
37 
38 	if (fields != NULL) {
39 		for (i = 0; fields[i].w_value != 0; i++) {
40 			printpoolfield(&ipe, IPLT_HASH, i);
41 			if (fields[i + 1].w_value != 0)
42 				printf("\t");
43 		}
44 		printf("\n");
45 	} else if ((opts & OPT_DEBUG) != 0) {
46 		PRINTF("\t%d\tAddress: %s", hv,
47 			inet_ntoa(ipe.ipe_addr.in4));
48 		printmask(ipe.ipe_family, (u_32_t *)&ipe.ipe_mask.in4_addr);
49 		PRINTF("\tRef. Count: %d\tGroup: %s\n", ipe.ipe_ref,
50 			ipe.ipe_group);
51 #ifdef USE_QUAD_T
52 		PRINTF("\tHits: %"PRIu64"\tBytes: %"PRIu64"\n",
53 		       ipe.ipe_hits, ipe.ipe_bytes);
54 #else
55 		PRINTF("\tHits: %lu\tBytes: %lu\n",
56 		       ipe.ipe_hits, ipe.ipe_bytes);
57 #endif
58 	} else {
59 		putchar(' ');
60 		printip(ipe.ipe_family, (u_32_t *)&ipe.ipe_addr.in4_addr);
61 		printmask(ipe.ipe_family, (u_32_t *)&ipe.ipe_mask.in4_addr);
62 		if (ipe.ipe_value != 0) {
63 			switch (iph->iph_type & ~IPHASH_ANON)
64 			{
65 			case IPHASH_GROUPMAP :
66 				if (strncmp(ipe.ipe_group, iph->iph_name,
67 					    FR_GROUPLEN))
68 					PRINTF(", group=%s", ipe.ipe_group);
69 				break;
70 			}
71 		}
72 		putchar(';');
73 	}
74 
75 	ipep = ipe.ipe_next;
76 	return ipep;
77 }
78