1170263Sdarrenr/*
2255332Scy * Copyright (C) 2012 by Darren Reed.
3170263Sdarrenr *
4170263Sdarrenr * See the IPFILTER.LICENCE file for details on licencing.
5170263Sdarrenr */
6170263Sdarrenr
7170263Sdarrenr#include "ipf.h"
8255332Scy#include <ctype.h>
9170263Sdarrenr
10170263Sdarrenr
11255332Scyvoid
12255332Scyprinthashdata(hp, opts)
13255332Scy	iphtable_t *hp;
14255332Scy	int opts;
15170263Sdarrenr{
16170263Sdarrenr
17170263Sdarrenr	if ((opts & OPT_DEBUG) == 0) {
18170263Sdarrenr		if ((hp->iph_type & IPHASH_ANON) == IPHASH_ANON)
19255332Scy			PRINTF("# 'anonymous' table refs %d\n", hp->iph_ref);
20170263Sdarrenr		if ((hp->iph_flags & IPHASH_DELETE) == IPHASH_DELETE)
21170263Sdarrenr			PRINTF("# ");
22170263Sdarrenr		switch (hp->iph_type & ~IPHASH_ANON)
23170263Sdarrenr		{
24170263Sdarrenr		case IPHASH_LOOKUP :
25170263Sdarrenr			PRINTF("table");
26170263Sdarrenr			break;
27170263Sdarrenr		case IPHASH_GROUPMAP :
28170263Sdarrenr			PRINTF("group-map");
29170263Sdarrenr			if (hp->iph_flags & FR_INQUE)
30170263Sdarrenr				PRINTF(" in");
31170263Sdarrenr			else if (hp->iph_flags & FR_OUTQUE)
32170263Sdarrenr				PRINTF(" out");
33170263Sdarrenr			else
34170263Sdarrenr				PRINTF(" ???");
35170263Sdarrenr			break;
36170263Sdarrenr		default :
37170263Sdarrenr			PRINTF("%#x", hp->iph_type);
38170263Sdarrenr			break;
39170263Sdarrenr		}
40255332Scy		PRINTF(" role=");
41170263Sdarrenr	} else {
42170263Sdarrenr		PRINTF("Hash Table %s: %s",
43255332Scy			ISDIGIT(*hp->iph_name) ? "Number" : "Name",
44170263Sdarrenr			hp->iph_name);
45170263Sdarrenr		if ((hp->iph_type & IPHASH_ANON) == IPHASH_ANON)
46170263Sdarrenr			PRINTF("(anon)");
47170263Sdarrenr		putchar(' ');
48170263Sdarrenr		PRINTF("Role: ");
49170263Sdarrenr	}
50170263Sdarrenr
51255332Scy	printunit(hp->iph_unit);
52170263Sdarrenr
53170263Sdarrenr	if ((opts & OPT_DEBUG) == 0) {
54170263Sdarrenr		if ((hp->iph_type & ~IPHASH_ANON) == IPHASH_LOOKUP)
55255332Scy			PRINTF(" type=hash");
56255332Scy		PRINTF(" %s=%s size=%lu",
57255332Scy			ISDIGIT(*hp->iph_name) ? "number" : "name",
58170263Sdarrenr			hp->iph_name, (u_long)hp->iph_size);
59170263Sdarrenr		if (hp->iph_seed != 0)
60255332Scy			PRINTF(" seed=%lu", hp->iph_seed);
61170263Sdarrenr		putchar('\n');
62170263Sdarrenr	} else {
63170263Sdarrenr		PRINTF(" Type: ");
64170263Sdarrenr		switch (hp->iph_type & ~IPHASH_ANON)
65170263Sdarrenr		{
66170263Sdarrenr		case IPHASH_LOOKUP :
67170263Sdarrenr			PRINTF("lookup");
68170263Sdarrenr			break;
69170263Sdarrenr		case IPHASH_GROUPMAP :
70170263Sdarrenr			PRINTF("groupmap Group. %s", hp->iph_name);
71170263Sdarrenr			break;
72170263Sdarrenr		default :
73170263Sdarrenr			break;
74170263Sdarrenr		}
75170263Sdarrenr
76170263Sdarrenr		putchar('\n');
77170263Sdarrenr		PRINTF("\t\tSize: %lu\tSeed: %lu",
78170263Sdarrenr			(u_long)hp->iph_size, hp->iph_seed);
79170263Sdarrenr		PRINTF("\tRef. Count: %d\tMasks: %#x\n", hp->iph_ref,
80255332Scy			hp->iph_maskset[0]);
81170263Sdarrenr	}
82170263Sdarrenr
83170263Sdarrenr	if ((opts & OPT_DEBUG) != 0) {
84170263Sdarrenr		struct in_addr m;
85170263Sdarrenr		int i;
86170263Sdarrenr
87170263Sdarrenr		for (i = 0; i < 32; i++) {
88255332Scy			if ((1 << i) & hp->iph_maskset[0]) {
89255332Scy				ntomask(AF_INET, i, &m.s_addr);
90170263Sdarrenr				PRINTF("\t\tMask: %s\n", inet_ntoa(m));
91170263Sdarrenr			}
92170263Sdarrenr		}
93170263Sdarrenr	}
94170263Sdarrenr}
95