ypclnt.3: Adjust yp_first() and yp_next() protos to follow the code.
[dragonfly.git] / lib / libnetgraph7 / debug.c
blob170a527b31b75e2a7736a01556b46f606fc4c192
1 /*
2 * debug.c
4 * Copyright (c) 1996-1999 Whistle Communications, Inc.
5 * All rights reserved.
6 *
7 * Subject to the following obligations and disclaimer of warranty, use and
8 * redistribution of this software, in source or object code forms, with or
9 * without modifications are expressly permitted by Whistle Communications;
10 * provided, however, that:
11 * 1. Any and all reproductions of the source or object code must include the
12 * copyright notice above and the following disclaimer of warranties; and
13 * 2. No rights are granted, in any manner or form, to use Whistle
14 * Communications, Inc. trademarks, including the mark "WHISTLE
15 * COMMUNICATIONS" on advertising, endorsements, or otherwise except as
16 * such appears in the above copyright notice or in the software.
18 * THIS SOFTWARE IS BEING PROVIDED BY WHISTLE COMMUNICATIONS "AS IS", AND
19 * TO THE MAXIMUM EXTENT PERMITTED BY LAW, WHISTLE COMMUNICATIONS MAKES NO
20 * REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THIS SOFTWARE,
21 * INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED WARRANTIES OF
22 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
23 * WHISTLE COMMUNICATIONS DOES NOT WARRANT, GUARANTEE, OR MAKE ANY
24 * REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS OF THE USE OF THIS
25 * SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY, RELIABILITY OR OTHERWISE.
26 * IN NO EVENT SHALL WHISTLE COMMUNICATIONS BE LIABLE FOR ANY DAMAGES
27 * RESULTING FROM OR ARISING OUT OF ANY USE OF THIS SOFTWARE, INCLUDING
28 * WITHOUT LIMITATION, ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
29 * PUNITIVE, OR CONSEQUENTIAL DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR
30 * SERVICES, LOSS OF USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY
31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
33 * THIS SOFTWARE, EVEN IF WHISTLE COMMUNICATIONS IS ADVISED OF THE POSSIBILITY
34 * OF SUCH DAMAGE.
36 * Author: Archie Cobbs <archie@whistle.com>
38 * $FreeBSD: src/lib/libnetgraph/debug.c,v 1.9 2005/10/25 20:58:30 ru Exp $
39 * $Whistle: debug.c,v 1.24 1999/01/24 01:15:33 archie Exp $
42 #include <sys/types.h>
43 #include <sys/time.h>
44 #include <sys/ioctl.h>
46 #include <stdarg.h>
48 #include <netinet/in.h>
49 #include <net/ethernet.h>
50 #include <net/bpf.h>
52 #include <netgraph7/ng_message.h>
53 #include <netgraph7/socket/ng_socket.h>
55 #include "netgraph.h"
56 #include "internal.h"
58 #include <netgraph7/UI/ng_UI.h>
59 #include <netgraph7/async/ng_async.h>
60 #include <netgraph7/bpf/ng_bpf.h>
61 #include <netgraph/bridge/ng_bridge.h>
62 #include <netgraph7/cisco/ng_cisco.h>
63 #include <netgraph7/deflate/ng_deflate.h>
64 #include <netgraph7/echo/ng_echo.h>
65 #include <netgraph7/eiface/ng_eiface.h>
66 #include <netgraph7/etf/ng_etf.h>
67 #include <netgraph7/ether/ng_ether.h>
69 #include <netgraph7/fec/ng_fec.h>
71 #include <netgraph7/frame_relay/ng_frame_relay.h>
72 #include <netgraph7/hole/ng_hole.h>
73 #include <netgraph7/hub/ng_hub.h>
74 #include <netgraph7/iface/ng_iface.h>
76 #include <netgraph7/ip_input/ng_ip_input.h>
78 #include <netgraph7/ksocket/ng_ksocket.h>
79 #include <netgraph7/l2tp/ng_l2tp.h>
80 #include <netgraph7/lmi/ng_lmi.h>
81 #include <netgraph7/mppc/ng_mppc.h>
82 #include <netgraph7/one2many/ng_one2many.h>
83 #include <netgraph7/ppp/ng_ppp.h>
84 #include <netgraph7/pppoe/ng_pppoe.h>
85 #include <netgraph7/pptpgre/ng_pptpgre.h>
86 #include <netgraph7/rfc1490/ng_rfc1490.h>
88 #include <netgraph7/socket/ng_socket.h>
89 #include <netgraph7/source/ng_source.h>
90 #include <netgraph7/split/ng_split.h>
92 #include <netgraph7/tcpmss/ng_tcpmss.h>
93 #include <netgraph7/tee/ng_tee.h>
94 #include <netgraph7/tty/ng_tty.h>
95 #include <netgraph7/vjc/ng_vjc.h>
96 #ifdef WHISTLE
97 #include <machine/../isa/df_def.h>
98 #include <machine/../isa/if_wfra.h>
99 #include <machine/../isa/ipac.h>
100 #include <netgraph/ng_df.h>
101 #include <netgraph/ng_ipac.h>
102 #include <netgraph/ng_tn.h>
103 #endif
105 /* Global debug level */
106 int _gNgDebugLevel = 0;
108 /* Debug printing functions */
109 void (*_NgLog) (const char *fmt,...) = warn;
110 void (*_NgLogx) (const char *fmt,...) = warnx;
112 /* Internal functions */
113 static const char *NgCookie(int cookie);
115 /* Known typecookie list */
116 struct ng_cookie {
117 int cookie;
118 const char *type;
121 #define COOKIE(c) { NGM_ ## c ## _COOKIE, #c }
123 /* List of known cookies */
124 static const struct ng_cookie cookies[] = {
125 COOKIE(UI),
126 COOKIE(ASYNC),
127 COOKIE(BPF),
128 COOKIE(BRIDGE),
129 COOKIE(CISCO),
130 COOKIE(DEFLATE),
131 COOKIE(ECHO),
133 COOKIE(EIFACE),
135 COOKIE(ETF),
136 COOKIE(ETHER),
138 COOKIE(FEC),
140 COOKIE(FRAMERELAY),
141 COOKIE(GENERIC),
142 COOKIE(HOLE),
143 COOKIE(HUB),
144 COOKIE(IFACE),
146 COOKIE(IP_INPUT),
148 COOKIE(KSOCKET),
149 COOKIE(L2TP),
150 COOKIE(LMI),
151 COOKIE(MPPC),
152 COOKIE(ONE2MANY),
153 COOKIE(PPP),
154 COOKIE(PPPOE),
155 COOKIE(PPTPGRE),
156 COOKIE(RFC1490),
157 COOKIE(SOCKET),
159 COOKIE(SOURCE),
160 COOKIE(SPLIT),
162 COOKIE(TCPMSS),
163 COOKIE(TEE),
164 COOKIE(TTY),
165 COOKIE(VJC),
166 #ifdef WHISTLE
167 COOKIE(DF),
168 COOKIE(IPAC),
169 COOKIE(TN),
170 COOKIE(WFRA),
171 #endif
172 { 0, NULL }
176 * Set debug level, ie, verbosity, if "level" is non-negative.
177 * Returns old debug level.
180 NgSetDebug(int level)
182 int old = _gNgDebugLevel;
184 if (level < 0)
185 level = old;
186 _gNgDebugLevel = level;
187 return (old);
191 * Set debug logging functions.
193 void
194 NgSetErrLog(void (*log) (const char *fmt,...),
195 void (*logx) (const char *fmt,...))
197 _NgLog = log;
198 _NgLogx = logx;
202 * Display a netgraph sockaddr
204 void
205 _NgDebugSockaddr(const struct sockaddr_ng *sg)
207 NGLOGX("SOCKADDR: { fam=%d len=%d addr=\"%s\" }",
208 sg->sg_family, sg->sg_len, sg->sg_data);
211 #define ARGS_BUFSIZE 2048
212 #define RECURSIVE_DEBUG_ADJUST 4
215 * Display a negraph message
217 void
218 _NgDebugMsg(const struct ng_mesg *msg, const char *path)
220 u_char buf[2 * sizeof(struct ng_mesg) + ARGS_BUFSIZE];
221 struct ng_mesg *const req = (struct ng_mesg *)buf;
222 struct ng_mesg *const bin = (struct ng_mesg *)req->data;
223 int arglen, csock = -1;
225 /* Display header stuff */
226 NGLOGX("NG_MESG :");
227 NGLOGX(" vers %d", msg->header.version);
228 NGLOGX(" arglen %d", msg->header.arglen);
229 NGLOGX(" flags %ld", msg->header.flags);
230 NGLOGX(" token %lu", (u_long)msg->header.token);
231 NGLOGX(" cookie %s (%d)",
232 NgCookie(msg->header.typecookie), msg->header.typecookie);
234 /* At lower debugging levels, skip ASCII translation */
235 if (_gNgDebugLevel <= 2)
236 goto fail2;
238 /* If path is not absolute, don't bother trying to use relative
239 address on a different socket for the ASCII translation */
240 if (strchr(path, ':') == NULL)
241 goto fail2;
243 /* Get a temporary socket */
244 if (NgMkSockNode(NULL, &csock, NULL) < 0)
245 goto fail;
247 /* Copy binary message into request message payload */
248 arglen = msg->header.arglen;
249 if (arglen > ARGS_BUFSIZE)
250 arglen = ARGS_BUFSIZE;
251 memcpy(bin, msg, sizeof(*msg) + arglen);
252 bin->header.arglen = arglen;
254 /* Lower debugging to avoid infinite recursion */
255 _gNgDebugLevel -= RECURSIVE_DEBUG_ADJUST;
257 /* Ask the node to translate the binary message to ASCII for us */
258 if (NgSendMsg(csock, path, NGM_GENERIC_COOKIE,
259 NGM_BINARY2ASCII, bin, sizeof(*bin) + bin->header.arglen) < 0) {
260 _gNgDebugLevel += RECURSIVE_DEBUG_ADJUST;
261 goto fail;
263 if (NgRecvMsg(csock, req, sizeof(buf), NULL) < 0) {
264 _gNgDebugLevel += RECURSIVE_DEBUG_ADJUST;
265 goto fail;
268 /* Restore debugging level */
269 _gNgDebugLevel += RECURSIVE_DEBUG_ADJUST;
271 /* Display command string and arguments */
272 NGLOGX(" cmd %s (%d)", bin->header.cmdstr, bin->header.cmd);
273 NGLOGX(" args %s", bin->data);
274 goto done;
276 fail:
277 /* Just display binary version */
278 NGLOGX(" [error decoding message: %s]", strerror(errno));
279 fail2:
280 NGLOGX(" cmd %d", msg->header.cmd);
281 NGLOGX(" args (%d bytes)", msg->header.arglen);
282 _NgDebugBytes(msg->data, msg->header.arglen);
284 done:
285 if (csock != -1)
286 (void)close(csock);
290 * Return the name of the node type corresponding to the cookie
292 static const char *
293 NgCookie(int cookie)
295 int k;
297 for (k = 0; cookies[k].cookie != 0; k++) {
298 if (cookies[k].cookie == cookie)
299 return cookies[k].type;
301 return "??";
305 * Dump bytes in hex
307 void
308 _NgDebugBytes(const u_char *ptr, int len)
310 char buf[100];
311 int k, count;
313 #define BYPERLINE 16
315 for (count = 0; count < len; ptr += BYPERLINE, count += BYPERLINE) {
317 /* Do hex */
318 snprintf(buf, sizeof(buf), "%04x: ", count);
319 for (k = 0; k < BYPERLINE; k++, count++)
320 if (count < len)
321 snprintf(buf + strlen(buf),
322 sizeof(buf) - strlen(buf), "%02x ", ptr[k]);
323 else
324 snprintf(buf + strlen(buf),
325 sizeof(buf) - strlen(buf), " ");
326 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " ");
327 count -= BYPERLINE;
329 /* Do ASCII */
330 for (k = 0; k < BYPERLINE; k++, count++)
331 if (count < len)
332 snprintf(buf + strlen(buf),
333 sizeof(buf) - strlen(buf),
334 "%c", isprint(ptr[k]) ? ptr[k] : '.');
335 else
336 snprintf(buf + strlen(buf),
337 sizeof(buf) - strlen(buf), " ");
338 count -= BYPERLINE;
340 /* Print it */
341 NGLOGX("%s", buf);