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