1145519Sdarrenr/*	$FreeBSD$	*/
2145510Sdarrenr
3145510Sdarrenr/*
4255332Scy * Copyright (C) 2012 by Darren Reed.
5145510Sdarrenr *
6145510Sdarrenr * See the IPFILTER.LICENCE file for details on licencing.
7145510Sdarrenr */
8145510Sdarrenr
9145510Sdarrenr#include "ipf.h"
10145510Sdarrenr
11145510Sdarrenr
12255332Scyiphtent_t *
13255332Scyprinthashnode(iph, ipep, copyfunc, opts, fields)
14255332Scy	iphtable_t *iph;
15255332Scy	iphtent_t *ipep;
16255332Scy	copyfunc_t copyfunc;
17255332Scy	int opts;
18255332Scy	wordtab_t *fields;
19145510Sdarrenr{
20145510Sdarrenr	iphtent_t ipe;
21255332Scy	u_int hv;
22255332Scy	int i;
23145510Sdarrenr
24145510Sdarrenr	if ((*copyfunc)(ipep, &ipe, sizeof(ipe)))
25145510Sdarrenr		return NULL;
26145510Sdarrenr
27255332Scy	hv = IPE_V4_HASH_FN(ipe.ipe_addr.i6[0], ipe.ipe_mask.i6[0],
28255332Scy			    iph->iph_size);
29145510Sdarrenr
30255332Scy	if (fields != NULL) {
31255332Scy		for (i = 0; fields[i].w_value != 0; i++) {
32255332Scy			printpoolfield(&ipe, IPLT_HASH, i);
33255332Scy			if (fields[i + 1].w_value != 0)
34255332Scy				printf("\t");
35255332Scy		}
36255332Scy		printf("\n");
37255332Scy	} else if ((opts & OPT_DEBUG) != 0) {
38255332Scy		PRINTF("\t%d\tAddress: %s", hv,
39145510Sdarrenr			inet_ntoa(ipe.ipe_addr.in4));
40255332Scy		printmask(ipe.ipe_family, (u_32_t *)&ipe.ipe_mask.in4_addr);
41145510Sdarrenr		PRINTF("\tRef. Count: %d\tGroup: %s\n", ipe.ipe_ref,
42145510Sdarrenr			ipe.ipe_group);
43255332Scy#ifdef USE_QUAD_T
44255332Scy		PRINTF("\tHits: %"PRIu64"\tBytes: %"PRIu64"\n",
45255332Scy		       ipe.ipe_hits, ipe.ipe_bytes);
46255332Scy#else
47255332Scy		PRINTF("\tHits: %lu\tBytes: %lu\n",
48255332Scy		       ipe.ipe_hits, ipe.ipe_bytes);
49255332Scy#endif
50145510Sdarrenr	} else {
51145510Sdarrenr		putchar(' ');
52255332Scy		printip(ipe.ipe_family, (u_32_t *)&ipe.ipe_addr.in4_addr);
53255332Scy		printmask(ipe.ipe_family, (u_32_t *)&ipe.ipe_mask.in4_addr);
54145510Sdarrenr		if (ipe.ipe_value != 0) {
55145510Sdarrenr			switch (iph->iph_type & ~IPHASH_ANON)
56145510Sdarrenr			{
57145510Sdarrenr			case IPHASH_GROUPMAP :
58145510Sdarrenr				if (strncmp(ipe.ipe_group, iph->iph_name,
59145510Sdarrenr					    FR_GROUPLEN))
60255332Scy					PRINTF(", group=%s", ipe.ipe_group);
61145510Sdarrenr				break;
62145510Sdarrenr			}
63145510Sdarrenr		}
64145510Sdarrenr		putchar(';');
65145510Sdarrenr	}
66170268Sdarrenr
67145510Sdarrenr	ipep = ipe.ipe_next;
68145510Sdarrenr	return ipep;
69145510Sdarrenr}
70