1/*	$FreeBSD$	*/
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
12iphtent_t *
13printhashnode(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
30	if (fields != NULL) {
31		for (i = 0; fields[i].w_value != 0; i++) {
32			printpoolfield(&ipe, IPLT_HASH, i);
33			if (fields[i + 1].w_value != 0)
34				printf("\t");
35		}
36		printf("\n");
37	} else if ((opts & OPT_DEBUG) != 0) {
38#ifdef USE_INET6
39		if (ipe.ipe_family == AF_INET6) {
40			char buf[INET6_ADDRSTRLEN + 1];
41			const char *str;
42
43			buf[0] = '\0';
44			str = inet_ntop(AF_INET6, &ipe.ipe_addr.in6,
45				buf, sizeof(buf) - 1);
46			if (str == NULL)
47				str = "???";
48			PRINTF("\t%d\tAddress: %s", hv, str);
49			printmask(ipe.ipe_family, (u_32_t *)&ipe.ipe_mask.in4_addr);
50			PRINTF("\tRef. Count: %d\tGroup: %s\n", ipe.ipe_ref,
51				ipe.ipe_group);
52#ifdef USE_QUAD_T
53			PRINTF("\tHits: %"PRIu64"\tBytes: %"PRIu64"\n",
54			       ipe.ipe_hits, ipe.ipe_bytes);
55#else
56			PRINTF("\tHits: %lu\tBytes: %lu\n",
57			       ipe.ipe_hits, ipe.ipe_bytes);
58#endif /* USE_QUAD_T */
59		} else if (ipe.ipe_family == AF_INET) {
60#else
61		if (ipe.ipe_family == AF_INET) {
62#endif /* USE_INET6 */
63			PRINTF("\t%d\tAddress: %s", hv,
64				inet_ntoa(ipe.ipe_addr.in4));
65			printmask(ipe.ipe_family, (u_32_t *)&ipe.ipe_mask.in4_addr);
66			PRINTF("\tRef. Count: %d\tGroup: %s\n", ipe.ipe_ref,
67				ipe.ipe_group);
68#ifdef USE_QUAD_T
69			PRINTF("\tHits: %"PRIu64"\tBytes: %"PRIu64"\n",
70			       ipe.ipe_hits, ipe.ipe_bytes);
71#else
72			PRINTF("\tHits: %lu\tBytes: %lu\n",
73			       ipe.ipe_hits, ipe.ipe_bytes);
74#endif /* USE_QUAD_T */
75		} else {
76			PRINTF("\tAddress: family: %d\n",
77				ipe.ipe_family);
78		}
79	} else {
80		putchar(' ');
81		printip(ipe.ipe_family, (u_32_t *)&ipe.ipe_addr.in4_addr);
82		printmask(ipe.ipe_family, (u_32_t *)&ipe.ipe_mask.in4_addr);
83		if (ipe.ipe_value != 0) {
84			switch (iph->iph_type & ~IPHASH_ANON)
85			{
86			case IPHASH_GROUPMAP :
87				if (strncmp(ipe.ipe_group, iph->iph_name,
88					    FR_GROUPLEN))
89					PRINTF(", group=%s", ipe.ipe_group);
90				break;
91			}
92		}
93		putchar(';');
94	}
95
96	ipep = ipe.ipe_next;
97	return ipep;
98}
99