xref: /freebsd/lib/libnetgraph/debug.c (revision 4cf49a43559ed9fdad601bdcccd2c55963008675)
14cf49a43SJulian Elischer 
24cf49a43SJulian Elischer /*
34cf49a43SJulian Elischer  * debug.c
44cf49a43SJulian Elischer  *
54cf49a43SJulian Elischer  * Copyright (c) 1996-1999 Whistle Communications, Inc.
64cf49a43SJulian Elischer  * All rights reserved.
74cf49a43SJulian Elischer  *
84cf49a43SJulian Elischer  * Subject to the following obligations and disclaimer of warranty, use and
94cf49a43SJulian Elischer  * redistribution of this software, in source or object code forms, with or
104cf49a43SJulian Elischer  * without modifications are expressly permitted by Whistle Communications;
114cf49a43SJulian Elischer  * provided, however, that:
124cf49a43SJulian Elischer  * 1. Any and all reproductions of the source or object code must include the
134cf49a43SJulian Elischer  *    copyright notice above and the following disclaimer of warranties; and
144cf49a43SJulian Elischer  * 2. No rights are granted, in any manner or form, to use Whistle
154cf49a43SJulian Elischer  *    Communications, Inc. trademarks, including the mark "WHISTLE
164cf49a43SJulian Elischer  *    COMMUNICATIONS" on advertising, endorsements, or otherwise except as
174cf49a43SJulian Elischer  *    such appears in the above copyright notice or in the software.
184cf49a43SJulian Elischer  *
194cf49a43SJulian Elischer  * THIS SOFTWARE IS BEING PROVIDED BY WHISTLE COMMUNICATIONS "AS IS", AND
204cf49a43SJulian Elischer  * TO THE MAXIMUM EXTENT PERMITTED BY LAW, WHISTLE COMMUNICATIONS MAKES NO
214cf49a43SJulian Elischer  * REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING THIS SOFTWARE,
224cf49a43SJulian Elischer  * INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED WARRANTIES OF
234cf49a43SJulian Elischer  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
244cf49a43SJulian Elischer  * WHISTLE COMMUNICATIONS DOES NOT WARRANT, GUARANTEE, OR MAKE ANY
254cf49a43SJulian Elischer  * REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS OF THE USE OF THIS
264cf49a43SJulian Elischer  * SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY, RELIABILITY OR OTHERWISE.
274cf49a43SJulian Elischer  * IN NO EVENT SHALL WHISTLE COMMUNICATIONS BE LIABLE FOR ANY DAMAGES
284cf49a43SJulian Elischer  * RESULTING FROM OR ARISING OUT OF ANY USE OF THIS SOFTWARE, INCLUDING
294cf49a43SJulian Elischer  * WITHOUT LIMITATION, ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
304cf49a43SJulian Elischer  * PUNITIVE, OR CONSEQUENTIAL DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR
314cf49a43SJulian Elischer  * SERVICES, LOSS OF USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY
324cf49a43SJulian Elischer  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
334cf49a43SJulian Elischer  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
344cf49a43SJulian Elischer  * THIS SOFTWARE, EVEN IF WHISTLE COMMUNICATIONS IS ADVISED OF THE POSSIBILITY
354cf49a43SJulian Elischer  * OF SUCH DAMAGE.
364cf49a43SJulian Elischer  *
374cf49a43SJulian Elischer  * Author: Archie Cobbs <archie@whistle.com>
384cf49a43SJulian Elischer  *
394cf49a43SJulian Elischer  * $FreeBSD$
404cf49a43SJulian Elischer  * $Whistle: debug.c,v 1.24 1999/01/24 01:15:33 archie Exp $
414cf49a43SJulian Elischer  */
424cf49a43SJulian Elischer 
434cf49a43SJulian Elischer #include <sys/types.h>
444cf49a43SJulian Elischer #include <stdarg.h>
454cf49a43SJulian Elischer #include <netgraph/ng_message.h>
464cf49a43SJulian Elischer #include <netgraph/ng_socket.h>
474cf49a43SJulian Elischer 
484cf49a43SJulian Elischer #include "netgraph.h"
494cf49a43SJulian Elischer #include "internal.h"
504cf49a43SJulian Elischer 
514cf49a43SJulian Elischer #include <netgraph/ng_socket.h>
524cf49a43SJulian Elischer #include <netgraph/ng_message.h>
534cf49a43SJulian Elischer #include <netgraph/ng_iface.h>
544cf49a43SJulian Elischer #include <netgraph/ng_rfc1490.h>
554cf49a43SJulian Elischer #include <netgraph/ng_cisco.h>
564cf49a43SJulian Elischer #include <netgraph/ng_async.h>
574cf49a43SJulian Elischer #include <netgraph/ng_ppp.h>
584cf49a43SJulian Elischer #include <netgraph/ng_frame_relay.h>
594cf49a43SJulian Elischer #include <netgraph/ng_lmi.h>
604cf49a43SJulian Elischer #include <netgraph/ng_tty.h>
614cf49a43SJulian Elischer #include <netgraph/ng_tty.h>
624cf49a43SJulian Elischer 
634cf49a43SJulian Elischer /* Global debug level */
644cf49a43SJulian Elischer int     _gNgDebugLevel = 0;
654cf49a43SJulian Elischer 
664cf49a43SJulian Elischer /* Debug printing functions */
674cf49a43SJulian Elischer void    (*_NgLog) (const char *fmt,...) = warn;
684cf49a43SJulian Elischer void    (*_NgLogx) (const char *fmt,...) = warnx;
694cf49a43SJulian Elischer 
704cf49a43SJulian Elischer /* Internal functions */
714cf49a43SJulian Elischer static const	char *NgCookie(int cookie);
724cf49a43SJulian Elischer static const	char *NgCmd(int cookie, int cmd);
734cf49a43SJulian Elischer static void	NgArgs(int cookie, int cmd, int resp, void *args, int arglen);
744cf49a43SJulian Elischer 
754cf49a43SJulian Elischer /*
764cf49a43SJulian Elischer  * Set debug level, ie, verbosity, if "level" is non-negative.
774cf49a43SJulian Elischer  * Returns old debug level.
784cf49a43SJulian Elischer  */
794cf49a43SJulian Elischer int
804cf49a43SJulian Elischer NgSetDebug(int level)
814cf49a43SJulian Elischer {
824cf49a43SJulian Elischer 	int old = _gNgDebugLevel;
834cf49a43SJulian Elischer 
844cf49a43SJulian Elischer 	if (level < 0)
854cf49a43SJulian Elischer 		level = old;
864cf49a43SJulian Elischer 	_gNgDebugLevel = level;
874cf49a43SJulian Elischer 	return (old);
884cf49a43SJulian Elischer }
894cf49a43SJulian Elischer 
904cf49a43SJulian Elischer /*
914cf49a43SJulian Elischer  * Set debug logging functions.
924cf49a43SJulian Elischer  */
934cf49a43SJulian Elischer void
944cf49a43SJulian Elischer NgSetErrLog(void (*log) (const char *fmt,...),
954cf49a43SJulian Elischer 		void (*logx) (const char *fmt,...))
964cf49a43SJulian Elischer {
974cf49a43SJulian Elischer 	_NgLog = log;
984cf49a43SJulian Elischer 	_NgLogx = logx;
994cf49a43SJulian Elischer }
1004cf49a43SJulian Elischer 
1014cf49a43SJulian Elischer /*
1024cf49a43SJulian Elischer  * Display a netgraph sockaddr
1034cf49a43SJulian Elischer  */
1044cf49a43SJulian Elischer void
1054cf49a43SJulian Elischer _NgDebugSockaddr(struct sockaddr_ng *sg)
1064cf49a43SJulian Elischer {
1074cf49a43SJulian Elischer 	NGLOGX("SOCKADDR: { fam=%d len=%d addr=\"%s\" }",
1084cf49a43SJulian Elischer 	       sg->sg_family, sg->sg_len, sg->sg_data);
1094cf49a43SJulian Elischer }
1104cf49a43SJulian Elischer 
1114cf49a43SJulian Elischer /*
1124cf49a43SJulian Elischer  * Display a negraph message
1134cf49a43SJulian Elischer  */
1144cf49a43SJulian Elischer void
1154cf49a43SJulian Elischer _NgDebugMsg(struct ng_mesg * msg)
1164cf49a43SJulian Elischer {
1174cf49a43SJulian Elischer 	NGLOGX("NG_MESG :");
1184cf49a43SJulian Elischer 	NGLOGX("  vers   %d", msg->header.version);
1194cf49a43SJulian Elischer 	NGLOGX("  arglen %d", msg->header.arglen);
1204cf49a43SJulian Elischer 	NGLOGX("  flags  %ld", msg->header.flags);
1214cf49a43SJulian Elischer 	NGLOGX("  token  %lu", (u_long) msg->header.token);
1224cf49a43SJulian Elischer 	NGLOGX("  cookie %s", NgCookie(msg->header.typecookie));
1234cf49a43SJulian Elischer 	NGLOGX("  cmd    %s", NgCmd(msg->header.typecookie, msg->header.cmd));
1244cf49a43SJulian Elischer 	NgArgs(msg->header.typecookie, msg->header.cmd,
1254cf49a43SJulian Elischer 	       (msg->header.flags & NGF_RESP), msg->data, msg->header.arglen);
1264cf49a43SJulian Elischer }
1274cf49a43SJulian Elischer 
1284cf49a43SJulian Elischer /*
1294cf49a43SJulian Elischer  * Return the name of the node type corresponding to the cookie
1304cf49a43SJulian Elischer  */
1314cf49a43SJulian Elischer static const char *
1324cf49a43SJulian Elischer NgCookie(int cookie)
1334cf49a43SJulian Elischer {
1344cf49a43SJulian Elischer 	static char buf[20];
1354cf49a43SJulian Elischer 
1364cf49a43SJulian Elischer 	switch (cookie) {
1374cf49a43SJulian Elischer 	case NGM_GENERIC_COOKIE:
1384cf49a43SJulian Elischer 		return "generic";
1394cf49a43SJulian Elischer 	case NGM_TTY_COOKIE:
1404cf49a43SJulian Elischer 		return "tty";
1414cf49a43SJulian Elischer 	case NGM_ASYNC_COOKIE:
1424cf49a43SJulian Elischer 		return "async";
1434cf49a43SJulian Elischer 	case NGM_IFACE_COOKIE:
1444cf49a43SJulian Elischer 		return "iface";
1454cf49a43SJulian Elischer 	case NGM_FRAMERELAY_COOKIE:
1464cf49a43SJulian Elischer 		return "frame_relay";
1474cf49a43SJulian Elischer 	case NGM_LMI_COOKIE:
1484cf49a43SJulian Elischer 		return "lmi";
1494cf49a43SJulian Elischer 	case NGM_CISCO_COOKIE:
1504cf49a43SJulian Elischer 		return "cisco";
1514cf49a43SJulian Elischer 	case NGM_PPP_COOKIE:
1524cf49a43SJulian Elischer 		return "ppp";
1534cf49a43SJulian Elischer 	case NGM_RFC1490_NODE_COOKIE:
1544cf49a43SJulian Elischer 		return "rfc1490";
1554cf49a43SJulian Elischer 	case NGM_SOCKET_COOKIE:
1564cf49a43SJulian Elischer 		return "socket";
1574cf49a43SJulian Elischer 	}
1584cf49a43SJulian Elischer 	snprintf(buf, sizeof(buf), "?? (%d)", cookie);
1594cf49a43SJulian Elischer 	return buf;
1604cf49a43SJulian Elischer }
1614cf49a43SJulian Elischer 
1624cf49a43SJulian Elischer /*
1634cf49a43SJulian Elischer  * Return the name of the command
1644cf49a43SJulian Elischer  */
1654cf49a43SJulian Elischer static const char *
1664cf49a43SJulian Elischer NgCmd(int cookie, int cmd)
1674cf49a43SJulian Elischer {
1684cf49a43SJulian Elischer 	static char buf[20];
1694cf49a43SJulian Elischer 
1704cf49a43SJulian Elischer 	switch (cookie) {
1714cf49a43SJulian Elischer 	case NGM_GENERIC_COOKIE:
1724cf49a43SJulian Elischer 		switch (cmd) {
1734cf49a43SJulian Elischer 		case NGM_SHUTDOWN:
1744cf49a43SJulian Elischer 			return "shutdown";
1754cf49a43SJulian Elischer 		case NGM_MKPEER:
1764cf49a43SJulian Elischer 			return "mkpeer";
1774cf49a43SJulian Elischer 		case NGM_CONNECT:
1784cf49a43SJulian Elischer 			return "connect";
1794cf49a43SJulian Elischer 		case NGM_NAME:
1804cf49a43SJulian Elischer 			return "name";
1814cf49a43SJulian Elischer 		case NGM_RMHOOK:
1824cf49a43SJulian Elischer 			return "rmhook";
1834cf49a43SJulian Elischer 		case NGM_NODEINFO:
1844cf49a43SJulian Elischer 			return "nodeinfo";
1854cf49a43SJulian Elischer 		case NGM_LISTHOOKS:
1864cf49a43SJulian Elischer 			return "listhooks";
1874cf49a43SJulian Elischer 		case NGM_LISTNAMES:
1884cf49a43SJulian Elischer 			return "listnames";
1894cf49a43SJulian Elischer 		case NGM_LISTNODES:
1904cf49a43SJulian Elischer 			return "listnodes";
1914cf49a43SJulian Elischer 		case NGM_TEXT_STATUS:
1924cf49a43SJulian Elischer 			return "text_status";
1934cf49a43SJulian Elischer 		}
1944cf49a43SJulian Elischer 		break;
1954cf49a43SJulian Elischer 	case NGM_TTY_COOKIE:
1964cf49a43SJulian Elischer 		switch (cmd) {
1974cf49a43SJulian Elischer 		case NGM_TTY_GET_HOTCHAR:
1984cf49a43SJulian Elischer 			return "getHotChar";
1994cf49a43SJulian Elischer 		case NGM_TTY_SET_HOTCHAR:
2004cf49a43SJulian Elischer 			return "setHotChar";
2014cf49a43SJulian Elischer 		}
2024cf49a43SJulian Elischer 		break;
2034cf49a43SJulian Elischer 	case NGM_ASYNC_COOKIE:
2044cf49a43SJulian Elischer 		switch (cmd) {
2054cf49a43SJulian Elischer 		case NGM_ASYNC_CMD_GET_STATS:
2064cf49a43SJulian Elischer 			return "getStats";
2074cf49a43SJulian Elischer 		case NGM_ASYNC_CMD_CLR_STATS:
2084cf49a43SJulian Elischer 			return "setStats";
2094cf49a43SJulian Elischer 		case NGM_ASYNC_CMD_SET_CONFIG:
2104cf49a43SJulian Elischer 			return "setConfig";
2114cf49a43SJulian Elischer 		case NGM_ASYNC_CMD_GET_CONFIG:
2124cf49a43SJulian Elischer 			return "getConfig";
2134cf49a43SJulian Elischer 		}
2144cf49a43SJulian Elischer 		break;
2154cf49a43SJulian Elischer 	case NGM_IFACE_COOKIE:
2164cf49a43SJulian Elischer 		switch (cmd) {
2174cf49a43SJulian Elischer 		case NGM_IFACE_GET_IFNAME:
2184cf49a43SJulian Elischer 			return "getIfName";
2194cf49a43SJulian Elischer 		case NGM_IFACE_GET_IFADDRS:
2204cf49a43SJulian Elischer 			return "getIfAddrs";
2214cf49a43SJulian Elischer 		}
2224cf49a43SJulian Elischer 		break;
2234cf49a43SJulian Elischer 	case NGM_LMI_COOKIE:
2244cf49a43SJulian Elischer 		switch (cmd) {
2254cf49a43SJulian Elischer 		case NGM_LMI_GET_STATUS:
2264cf49a43SJulian Elischer 			return "get-status";
2274cf49a43SJulian Elischer 		}
2284cf49a43SJulian Elischer 		break;
2294cf49a43SJulian Elischer 	}
2304cf49a43SJulian Elischer 	snprintf(buf, sizeof(buf), "?? (%d)", cmd);
2314cf49a43SJulian Elischer 	return buf;
2324cf49a43SJulian Elischer }
2334cf49a43SJulian Elischer 
2344cf49a43SJulian Elischer /*
2354cf49a43SJulian Elischer  * Decode message arguments
2364cf49a43SJulian Elischer  */
2374cf49a43SJulian Elischer static void
2384cf49a43SJulian Elischer NgArgs(int cookie, int cmd, int resp, void *args, int arglen)
2394cf49a43SJulian Elischer {
2404cf49a43SJulian Elischer 
2414cf49a43SJulian Elischer switch (cookie) {
2424cf49a43SJulian Elischer case NGM_GENERIC_COOKIE:
2434cf49a43SJulian Elischer 	switch (cmd) {
2444cf49a43SJulian Elischer 	case NGM_SHUTDOWN:
2454cf49a43SJulian Elischer 		return;
2464cf49a43SJulian Elischer 	case NGM_MKPEER:
2474cf49a43SJulian Elischer 	    {
2484cf49a43SJulian Elischer 		struct ngm_mkpeer *const mkp = (struct ngm_mkpeer *) args;
2494cf49a43SJulian Elischer 
2504cf49a43SJulian Elischer 		if (resp)
2514cf49a43SJulian Elischer 			return;
2524cf49a43SJulian Elischer 		NGLOGX("    type     \"%s\"", mkp->type);
2534cf49a43SJulian Elischer 		NGLOGX("    ourhook  \"%s\"", mkp->ourhook);
2544cf49a43SJulian Elischer 		NGLOGX("    peerhook \"%s\"", mkp->peerhook);
2554cf49a43SJulian Elischer 		return;
2564cf49a43SJulian Elischer 	    }
2574cf49a43SJulian Elischer 	case NGM_CONNECT:
2584cf49a43SJulian Elischer 	    {
2594cf49a43SJulian Elischer 		struct ngm_connect *const ngc = (struct ngm_connect *) args;
2604cf49a43SJulian Elischer 
2614cf49a43SJulian Elischer 		if (resp)
2624cf49a43SJulian Elischer 			return;
2634cf49a43SJulian Elischer 		NGLOGX("    path     \"%s\"", ngc->path);
2644cf49a43SJulian Elischer 		NGLOGX("    ourhook  \"%s\"", ngc->ourhook);
2654cf49a43SJulian Elischer 		NGLOGX("    peerhook \"%s\"", ngc->peerhook);
2664cf49a43SJulian Elischer 		return;
2674cf49a43SJulian Elischer 	    }
2684cf49a43SJulian Elischer 	case NGM_NAME:
2694cf49a43SJulian Elischer 	    {
2704cf49a43SJulian Elischer 		struct ngm_name *const ngn = (struct ngm_name *) args;
2714cf49a43SJulian Elischer 
2724cf49a43SJulian Elischer 		if (resp)
2734cf49a43SJulian Elischer 			return;
2744cf49a43SJulian Elischer 		NGLOGX("    name \"%s\"", ngn->name);
2754cf49a43SJulian Elischer 		return;
2764cf49a43SJulian Elischer 	    }
2774cf49a43SJulian Elischer 	case NGM_RMHOOK:
2784cf49a43SJulian Elischer 	    {
2794cf49a43SJulian Elischer 		struct ngm_rmhook *const ngr = (struct ngm_rmhook *) args;
2804cf49a43SJulian Elischer 
2814cf49a43SJulian Elischer 		if (resp)
2824cf49a43SJulian Elischer 			return;
2834cf49a43SJulian Elischer 		NGLOGX("    hook \"%s\"", ngr->ourhook);
2844cf49a43SJulian Elischer 		return;
2854cf49a43SJulian Elischer 	    }
2864cf49a43SJulian Elischer 	case NGM_NODEINFO:
2874cf49a43SJulian Elischer 		return;
2884cf49a43SJulian Elischer 	case NGM_LISTHOOKS:
2894cf49a43SJulian Elischer 		return;
2904cf49a43SJulian Elischer 	case NGM_LISTNAMES:
2914cf49a43SJulian Elischer 	case NGM_LISTNODES:
2924cf49a43SJulian Elischer 		return;
2934cf49a43SJulian Elischer 	case NGM_TEXT_STATUS:
2944cf49a43SJulian Elischer 		if (!resp)
2954cf49a43SJulian Elischer 			return;
2964cf49a43SJulian Elischer 		NGLOGX("    status \"%s\"", (char *) args);
2974cf49a43SJulian Elischer 	    	return;
2984cf49a43SJulian Elischer 	}
2994cf49a43SJulian Elischer 	break;
3004cf49a43SJulian Elischer 
3014cf49a43SJulian Elischer case NGM_TTY_COOKIE:
3024cf49a43SJulian Elischer 	switch (cmd) {
3034cf49a43SJulian Elischer 	case NGM_TTY_GET_HOTCHAR:
3044cf49a43SJulian Elischer 		if (!resp)
3054cf49a43SJulian Elischer 			return;
3064cf49a43SJulian Elischer 		NGLOGX("    char 0x%02x", *((int *) args));
3074cf49a43SJulian Elischer 		return;
3084cf49a43SJulian Elischer 	case NGM_TTY_SET_HOTCHAR:
3094cf49a43SJulian Elischer 		NGLOGX("    char 0x%02x", *((int *) args));
3104cf49a43SJulian Elischer 		return;
3114cf49a43SJulian Elischer 	}
3124cf49a43SJulian Elischer 	break;
3134cf49a43SJulian Elischer 
3144cf49a43SJulian Elischer case NGM_ASYNC_COOKIE:
3154cf49a43SJulian Elischer 	switch (cmd) {
3164cf49a43SJulian Elischer 	case NGM_ASYNC_CMD_GET_STATS:
3174cf49a43SJulian Elischer 	    {
3184cf49a43SJulian Elischer 		struct ng_async_stat *const as = (struct ng_async_stat *) args;
3194cf49a43SJulian Elischer 
3204cf49a43SJulian Elischer 		if (!resp)
3214cf49a43SJulian Elischer 			return;
3224cf49a43SJulian Elischer 		NGLOGX("    syncOctets = %lu", as->syncOctets);
3234cf49a43SJulian Elischer 		NGLOGX("    syncFrames = %lu", as->syncFrames);
3244cf49a43SJulian Elischer 		NGLOGX("    syncOverflows = %lu", as->syncOverflows);
3254cf49a43SJulian Elischer 		NGLOGX("    asyncOctets = %lu", as->asyncOctets);
3264cf49a43SJulian Elischer 		NGLOGX("    asyncFrames = %lu", as->asyncFrames);
3274cf49a43SJulian Elischer 		NGLOGX("    asyncRunts = %lu", as->asyncRunts);
3284cf49a43SJulian Elischer 		NGLOGX("    asyncOverflows = %lu", as->asyncOverflows);
3294cf49a43SJulian Elischer 		NGLOGX("    asyncBadCheckSums = %lu", as->asyncBadCheckSums);
3304cf49a43SJulian Elischer 		return;
3314cf49a43SJulian Elischer 	    }
3324cf49a43SJulian Elischer 	case NGM_ASYNC_CMD_GET_CONFIG:
3334cf49a43SJulian Elischer 	case NGM_ASYNC_CMD_SET_CONFIG:
3344cf49a43SJulian Elischer 	    {
3354cf49a43SJulian Elischer 		struct ng_async_cfg *const ac = (struct ng_async_cfg *) args;
3364cf49a43SJulian Elischer 
3374cf49a43SJulian Elischer 		if (!resp ^ (cmd != NGM_ASYNC_CMD_GET_CONFIG))
3384cf49a43SJulian Elischer 			return;
3394cf49a43SJulian Elischer 		NGLOGX("    enabled   %s", ac->enabled ? "YES" : "NO");
3404cf49a43SJulian Elischer 		NGLOGX("    acfcomp   %s", ac->acfcomp ? "YES" : "NO");
3414cf49a43SJulian Elischer 		NGLOGX("    Async MRU %u", ac->amru);
3424cf49a43SJulian Elischer 		NGLOGX("    Sync MRU  %u", ac->smru);
3434cf49a43SJulian Elischer 		NGLOGX("    ACCM      0x%08x", ac->accm);
3444cf49a43SJulian Elischer 		return;
3454cf49a43SJulian Elischer 	    }
3464cf49a43SJulian Elischer 	case NGM_ASYNC_CMD_CLR_STATS:
3474cf49a43SJulian Elischer 		return;
3484cf49a43SJulian Elischer 	}
3494cf49a43SJulian Elischer 	break;
3504cf49a43SJulian Elischer 
3514cf49a43SJulian Elischer case NGM_IFACE_COOKIE:
3524cf49a43SJulian Elischer 	switch (cmd) {
3534cf49a43SJulian Elischer 	case NGM_IFACE_GET_IFNAME:
3544cf49a43SJulian Elischer 		return;
3554cf49a43SJulian Elischer 	case NGM_IFACE_GET_IFADDRS:
3564cf49a43SJulian Elischer 		return;
3574cf49a43SJulian Elischer 	}
3584cf49a43SJulian Elischer 	break;
3594cf49a43SJulian Elischer 
3604cf49a43SJulian Elischer 	}
3614cf49a43SJulian Elischer 	_NgDebugBytes(args, arglen);
3624cf49a43SJulian Elischer }
3634cf49a43SJulian Elischer 
3644cf49a43SJulian Elischer /*
3654cf49a43SJulian Elischer  * Dump bytes in hex
3664cf49a43SJulian Elischer  */
3674cf49a43SJulian Elischer void
3684cf49a43SJulian Elischer _NgDebugBytes(const u_char * ptr, int len)
3694cf49a43SJulian Elischer {
3704cf49a43SJulian Elischer 	char    buf[100];
3714cf49a43SJulian Elischer 	int     k, count;
3724cf49a43SJulian Elischer 
3734cf49a43SJulian Elischer #define BYPERLINE	16
3744cf49a43SJulian Elischer 
3754cf49a43SJulian Elischer 	for (count = 0; count < len; ptr += BYPERLINE, count += BYPERLINE) {
3764cf49a43SJulian Elischer 
3774cf49a43SJulian Elischer 		/* Do hex */
3784cf49a43SJulian Elischer 		snprintf(buf, sizeof(buf), "%04x:  ", count);
3794cf49a43SJulian Elischer 		for (k = 0; k < BYPERLINE; k++, count++)
3804cf49a43SJulian Elischer 			if (count < len)
3814cf49a43SJulian Elischer 				snprintf(buf + strlen(buf),
3824cf49a43SJulian Elischer 				    sizeof(buf) - strlen(buf), "%02x ", ptr[k]);
3834cf49a43SJulian Elischer 			else
3844cf49a43SJulian Elischer 				snprintf(buf + strlen(buf),
3854cf49a43SJulian Elischer 				    sizeof(buf) - strlen(buf), "   ");
3864cf49a43SJulian Elischer 		snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "  ");
3874cf49a43SJulian Elischer 		count -= BYPERLINE;
3884cf49a43SJulian Elischer 
3894cf49a43SJulian Elischer 		/* Do ASCII */
3904cf49a43SJulian Elischer 		for (k = 0; k < BYPERLINE; k++, count++)
3914cf49a43SJulian Elischer 			if (count < len)
3924cf49a43SJulian Elischer 				snprintf(buf + strlen(buf),
3934cf49a43SJulian Elischer 				    sizeof(buf) - strlen(buf),
3944cf49a43SJulian Elischer 				    "%c", isprint(ptr[k]) ? ptr[k] : '.');
3954cf49a43SJulian Elischer 			else
3964cf49a43SJulian Elischer 				snprintf(buf + strlen(buf),
3974cf49a43SJulian Elischer 				    sizeof(buf) - strlen(buf), "  ");
3984cf49a43SJulian Elischer 		count -= BYPERLINE;
3994cf49a43SJulian Elischer 
4004cf49a43SJulian Elischer 		/* Print it */
4014cf49a43SJulian Elischer 		NGLOGX("%s", buf);
4024cf49a43SJulian Elischer 	}
4034cf49a43SJulian Elischer }
4044cf49a43SJulian Elischer 
405