]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/ipfilter/lib/printstate.c
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / contrib / ipfilter / lib / printstate.c
1 /*      $FreeBSD$       */
2
3 /*
4  * Copyright (C) 2002-2005 by Darren Reed.
5  *
6  * See the IPFILTER.LICENCE file for details on licencing.
7  */
8
9 #include "ipf.h"
10 #include "kmem.h"
11
12 #define PRINTF  (void)printf
13 #define FPRINTF (void)fprintf
14
15 ipstate_t *printstate(sp, opts, now)
16 ipstate_t *sp;
17 int opts;
18 u_long now;
19 {
20         synclist_t ipsync;
21
22         if (sp->is_phnext == NULL)
23                 PRINTF("ORPHAN ");
24         PRINTF("%s -> ", hostname(sp->is_v, &sp->is_src.in4));
25         PRINTF("%s pass %#x pr %d state %d/%d",
26                 hostname(sp->is_v, &sp->is_dst.in4), sp->is_pass, sp->is_p,
27                 sp->is_state[0], sp->is_state[1]);
28         if (opts & OPT_DEBUG)
29                 PRINTF(" bkt %d ref %d", sp->is_hv, sp->is_ref);
30         PRINTF("\n\ttag %u ttl %lu", sp->is_tag, sp->is_die - now);
31
32         if (sp->is_p == IPPROTO_TCP) {
33                 PRINTF("\n\t%hu -> %hu %x:%x %hu<<%d:%hu<<%d\n",
34                         ntohs(sp->is_sport), ntohs(sp->is_dport),
35                         sp->is_send, sp->is_dend,
36                         sp->is_maxswin, sp->is_swinscale,
37                         sp->is_maxdwin, sp->is_dwinscale);
38                 PRINTF("\tcmsk %04x smsk %04x s0 %08x/%08x\n",
39                         sp->is_smsk[0], sp->is_smsk[1],
40                         sp->is_s0[0], sp->is_s0[1]);
41                 PRINTF("\tFWD:ISN inc %x sumd %x\n",
42                         sp->is_isninc[0], sp->is_sumd[0]);
43                 PRINTF("\tREV:ISN inc %x sumd %x\n",
44                         sp->is_isninc[1], sp->is_sumd[1]);
45 #ifdef  IPFILTER_SCAN
46                 PRINTF("\tsbuf[0] [");
47                 printsbuf(sp->is_sbuf[0]);
48                 PRINTF("] sbuf[1] [");
49                 printsbuf(sp->is_sbuf[1]);
50                 PRINTF("]\n");
51 #endif
52         } else if (sp->is_p == IPPROTO_UDP) {
53                 PRINTF(" %hu -> %hu\n", ntohs(sp->is_sport),
54                         ntohs(sp->is_dport));
55         } else if (sp->is_p == IPPROTO_GRE) {
56                 PRINTF(" call %hx/%hx\n", ntohs(sp->is_gre.gs_call[0]),
57                        ntohs(sp->is_gre.gs_call[1]));
58         } else if (sp->is_p == IPPROTO_ICMP
59 #ifdef  USE_INET6
60                  || sp->is_p == IPPROTO_ICMPV6
61 #endif
62                 )
63                 PRINTF(" id %hu seq %hu type %d\n", sp->is_icmp.ici_id,
64                         sp->is_icmp.ici_seq, sp->is_icmp.ici_type);
65
66 #ifdef        USE_QUAD_T
67         PRINTF("\tforward: pkts in %lld bytes in %lld pkts out %lld bytes out %lld\n\tbackward: pkts in %lld bytes in %lld pkts out %lld bytes out %lld\n",
68                 sp->is_pkts[0], sp->is_bytes[0],
69                 sp->is_pkts[1], sp->is_bytes[1],
70                 sp->is_pkts[2], sp->is_bytes[2],
71                 sp->is_pkts[3], sp->is_bytes[3]);
72 #else
73         PRINTF("\tforward: pkts in %ld bytes in %ld pkts out %ld bytes out %ld\n\tbackward: pkts in %ld bytes in %ld pkts out %ld bytes out %ld\n",
74                 sp->is_pkts[0], sp->is_bytes[0],
75                 sp->is_pkts[1], sp->is_bytes[1],
76                 sp->is_pkts[2], sp->is_bytes[2],
77                 sp->is_pkts[3], sp->is_bytes[3]);
78 #endif
79
80         PRINTF("\t");
81
82         /*
83          * Print out bits set in the result code for the state being
84          * kept as they would for a rule.
85          */
86         if (FR_ISPASS(sp->is_pass)) {
87                 PRINTF("pass");
88         } else if (FR_ISBLOCK(sp->is_pass)) {
89                 PRINTF("block");
90                 switch (sp->is_pass & FR_RETMASK)
91                 {
92                 case FR_RETICMP :
93                         PRINTF(" return-icmp");
94                         break;
95                 case FR_FAKEICMP :
96                         PRINTF(" return-icmp-as-dest");
97                         break;
98                 case FR_RETRST :
99                         PRINTF(" return-rst");
100                         break;
101                 default :
102                         break;
103                 }
104         } else if ((sp->is_pass & FR_LOGMASK) == FR_LOG) {
105                         PRINTF("log");
106                 if (sp->is_pass & FR_LOGBODY)
107                         PRINTF(" body");
108                 if (sp->is_pass & FR_LOGFIRST)
109                         PRINTF(" first");
110         } else if (FR_ISACCOUNT(sp->is_pass)) {
111                 PRINTF("count");
112         } else if (FR_ISPREAUTH(sp->is_pass)) {
113                 PRINTF("preauth");
114         } else if (FR_ISAUTH(sp->is_pass))
115                 PRINTF("auth");
116
117         if (sp->is_pass & FR_OUTQUE)
118                 PRINTF(" out");
119         else
120                 PRINTF(" in");
121
122         if ((sp->is_pass & FR_LOG) != 0) {
123                 PRINTF(" log");
124                 if (sp->is_pass & FR_LOGBODY)
125                         PRINTF(" body");
126                 if (sp->is_pass & FR_LOGFIRST)
127                         PRINTF(" first");
128                 if (sp->is_pass & FR_LOGORBLOCK)
129                         PRINTF(" or-block");
130         }
131         if (sp->is_pass & FR_QUICK)
132                 PRINTF(" quick");
133         if (sp->is_pass & FR_KEEPFRAG)
134                 PRINTF(" keep frags");
135         /* a given; no? */
136         if (sp->is_pass & FR_KEEPSTATE) {
137                 PRINTF(" keep state");
138                 if (sp->is_pass & FR_STATESYNC) 
139                         PRINTF(" ( sync )");
140         }
141         PRINTF("\tIPv%d", sp->is_v);
142         PRINTF("\n");
143
144         PRINTF("\tpkt_flags & %x(%x) = %x,\t",
145                 sp->is_flags & 0xf, sp->is_flags,
146                 sp->is_flags >> 4);
147         PRINTF("\tpkt_options & %x = %x, %x = %x \n", sp->is_optmsk[0],
148                 sp->is_opt[0], sp->is_optmsk[1], sp->is_opt[1]);
149         PRINTF("\tpkt_security & %x = %x, pkt_auth & %x = %x\n",
150                 sp->is_secmsk, sp->is_sec, sp->is_authmsk,
151                 sp->is_auth);
152         PRINTF("\tis_flx %#x %#x %#x %#x\n", sp->is_flx[0][0], sp->is_flx[0][1],
153                sp->is_flx[1][0], sp->is_flx[1][1]);
154         PRINTF("\tinterfaces: in %s[%s", getifname(sp->is_ifp[0]),
155                 sp->is_ifname[0]);
156         if (opts & OPT_DEBUG)
157                 PRINTF("/%p", sp->is_ifp[0]);
158         putchar(']');
159         PRINTF(",%s[%s", getifname(sp->is_ifp[1]), sp->is_ifname[1]);
160         if (opts & OPT_DEBUG)
161                 PRINTF("/%p", sp->is_ifp[1]);
162         putchar(']');
163         PRINTF(" out %s[%s", getifname(sp->is_ifp[2]), sp->is_ifname[2]);
164         if (opts & OPT_DEBUG)
165                 PRINTF("/%p", sp->is_ifp[2]);
166         putchar(']');
167         PRINTF(",%s[%s", getifname(sp->is_ifp[3]), sp->is_ifname[3]);
168         if (opts & OPT_DEBUG)
169                 PRINTF("/%p", sp->is_ifp[3]);
170         PRINTF("]\n");
171
172         if (sp->is_sync != NULL) {
173
174                 if (kmemcpy((char *)&ipsync, (u_long)sp->is_sync, sizeof(ipsync))) {
175         
176                         PRINTF("\tSync status: status could not be retrieved\n");
177                         return NULL;
178                 }
179
180                 PRINTF("\tSync status: idx %d num %d v %d pr %d rev %d\n",
181                         ipsync.sl_idx, ipsync.sl_num, ipsync.sl_v,
182                         ipsync.sl_p, ipsync.sl_rev);
183                 
184         } else {
185                 PRINTF("\tSync status: not synchronized\n");
186         }
187
188         return sp->is_next;
189 }