1 /*        $NetBSD: printhashdata.c,v 1.1.1.2 2012/07/22 13:44:40 darrenr 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 #include <ctype.h>
11 
12 
13 void
printhashdata(hp,opts)14 printhashdata(hp, opts)
15           iphtable_t *hp;
16           int opts;
17 {
18 
19           if ((opts & OPT_DEBUG) == 0) {
20                     if ((hp->iph_type & IPHASH_ANON) == IPHASH_ANON)
21                               PRINTF("# 'anonymous' table refs %d\n", hp->iph_ref);
22                     if ((hp->iph_flags & IPHASH_DELETE) == IPHASH_DELETE)
23                               PRINTF("# ");
24                     switch (hp->iph_type & ~IPHASH_ANON)
25                     {
26                     case IPHASH_LOOKUP :
27                               PRINTF("table");
28                               break;
29                     case IPHASH_GROUPMAP :
30                               PRINTF("group-map");
31                               if (hp->iph_flags & FR_INQUE)
32                                         PRINTF(" in");
33                               else if (hp->iph_flags & FR_OUTQUE)
34                                         PRINTF(" out");
35                               else
36                                         PRINTF(" ???");
37                               break;
38                     default :
39                               PRINTF("%#x", hp->iph_type);
40                               break;
41                     }
42                     PRINTF(" role=");
43           } else {
44                     PRINTF("Hash Table %s: %s",
45                               ISDIGIT(*hp->iph_name) ? "Number" : "Name",
46                               hp->iph_name);
47                     if ((hp->iph_type & IPHASH_ANON) == IPHASH_ANON)
48                               PRINTF("(anon)");
49                     putchar(' ');
50                     PRINTF("Role: ");
51           }
52 
53           printunit(hp->iph_unit);
54 
55           if ((opts & OPT_DEBUG) == 0) {
56                     if ((hp->iph_type & ~IPHASH_ANON) == IPHASH_LOOKUP)
57                               PRINTF(" type=hash");
58                     PRINTF(" %s=%s size=%lu",
59                               ISDIGIT(*hp->iph_name) ? "number" : "name",
60                               hp->iph_name, (u_long)hp->iph_size);
61                     if (hp->iph_seed != 0)
62                               PRINTF(" seed=%lu", hp->iph_seed);
63                     putchar('\n');
64           } else {
65                     PRINTF(" Type: ");
66                     switch (hp->iph_type & ~IPHASH_ANON)
67                     {
68                     case IPHASH_LOOKUP :
69                               PRINTF("lookup");
70                               break;
71                     case IPHASH_GROUPMAP :
72                               PRINTF("groupmap Group. %s", hp->iph_name);
73                               break;
74                     default :
75                               break;
76                     }
77 
78                     putchar('\n');
79                     PRINTF("\t\tSize: %lu\tSeed: %lu",
80                               (u_long)hp->iph_size, hp->iph_seed);
81                     PRINTF("\tRef. Count: %d\tMasks: %#x\n", hp->iph_ref,
82                               hp->iph_maskset[0]);
83           }
84 
85           if ((opts & OPT_DEBUG) != 0) {
86                     struct in_addr m;
87                     int i;
88 
89                     for (i = 0; i < 32; i++) {
90                               if ((1 << i) & hp->iph_maskset[0]) {
91                                         ntomask(AF_INET, i, &m.s_addr);
92                                         PRINTF("\t\tMask: %s\n", inet_ntoa(m));
93                               }
94                     }
95           }
96 }
97