/*	$OpenBSD: inet6.c,v 1.31 2004/11/17 01:47:20 itojun Exp $	*/
/*	BSDI inet.c,v 2.3 1995/10/24 02:19:29 prb Exp	*/
/*
 * Copyright (c) 1983, 1988, 1993
 *	The Regents of the University of California.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#ifdef  INHERITED_CODE
#ifndef lint
#if 0
static char sccsid[] = "@(#)inet.c	8.4 (Berkeley) 4/20/94";
#else
/*__RCSID("$OpenBSD: inet6.c,v 1.31 2004/11/17 01:47:20 itojun Exp $");*/
/*__RCSID("KAME Id: inet6.c,v 1.10 2000/02/09 10:49:31 itojun Exp");*/
#endif
#endif /* not lint */
#endif

#include <net-snmp/net-snmp-config.h>

#if HAVE_UNISTD_H
#include <unistd.h>
#endif
#if HAVE_WINSOCK_H
#include "winstub.h"
#endif
#if HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#if HAVE_NETDB_H
#include <netdb.h>
#endif
#if HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif

#if HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#if HAVE_ARPA_INET_H
#include <arpa/inet.h>
#endif

#include <net-snmp/net-snmp-includes.h>

#include "main.h"
#include "netstat.h"

struct stat_table {
    unsigned int entry;      /* entry number in table */
    /*
     * format string to printf(description, value) 
     * warning: the %d must be before the %s 
     */
    char            description[80];
};

void	inetxprint(int, struct sockaddr_in6 , int, const char *, int);

/*
 * Print a summary of TCP connections
 * Listening processes are suppressed unless the
 *   -a (all) flag is specified.
 */
const char     *tcpxstates[] = {
    "",
    "CLOSED",
    "LISTEN",
    "SYNSENT",
    "SYNRECEIVED",
    "ESTABLISHED",
    "FINWAIT1",
    "FINWAIT2",
    "CLOSEWAIT",
    "LASTACK",
    "CLOSING",
    "TIMEWAIT"
};
#define TCP_NSTATES 11

typedef struct {
    int stat;
    int hcstat;
    const char *str;
} systemstats_t;

systemstats_t systemstats[] = {
    {  3,  4, "datagrams input" },
    {  5,  6, "octets received" },
    {  7,  0, "hdr errors input" },
    {  8,  0, "no routes input" },
    {  9,  0, "address errors input" },
    { 10,  0, "unknown protocol input" },
    { 12, 13, "input datagrams forwarded" },
    { 11,  0, "truncated datagrams input" },
    { 14,  0, "input reassembly required" },
    { 15,  0, "input reassemled OK" },
    { 16,  0, "input reassembly failed" },
    { 17,  0, "input datagrams discarded" },
    { 18, 19, "input datagrams received" },
    { 20, 21, "output datagram requests" },
    { 22,  0, "output no route" },
    { 23, 24, "datagrams forwarded" },
    { 25,  0, "output datagrams discarded" },
    { 26,  0, "output datagrams fragmentation required" },
    { 27,  0, "output datagrams fragmented" },
    { 28,  0, "output fragmentation failed" },
    { 29,  0, "fragments created" },
    { 30, 31, "datagrams transmitted" },
    { 32, 33, "octets transmitted" },
    {  0 }
};

systemstats_t icmpstats[] = {
    {  2,  0, "input messages" },
    {  3,  0, "input errors" },
    {  4,  0, "output messages" },
    {  5,  0, "output errors" },
    {  0 }
};

typedef struct {
    int code;
    const char *name;
} codelist_t;

codelist_t icmpcodes[] = {
    {   0, "Echo reply" },
    {   3, "Destination unreachable" },
    {   4, "Source quench" },
    {   5, "Redirect" },
    {   6, "Alternate host address" },
    {   8, "Echo request" },
    {   9, "Router advertisement" },
    {  10, "Router selection" },
    {  11, "Time exceeded" },
    {  12, "Parameter problem" },
    {  13, "Timestamp request" },
    {  14, "Timestamp reply" },
    {  15, "Information request" },
    {  16, "Information reply" },
    {  17, "Address mask request" },
    {  18, "Address mask reply" },
    { 0 }
};

codelist_t icmp6codes[] = {
    {   1,   "Destination Unreachable" },
    {   2,   "Packet Too Big" },
    {   3,   "Time Exceeded" },
    {   4,   "Parameter Problem" },
    { 100,   "Private experimentation 100" },
    { 101,   "Private experimentation 101" },
    { 127,   "Reserved for expansion of ICMPv6 error messages" },
    { 128,   "Echo Request" },
    { 129,   "Echo Reply" },
    { 130,   "Multicast Listener Query" },
    { 131,   "Multicast Listener Report" },
    { 132,   "Multicast Listener Done" },
    { 133,   "Router Solicitation" },
    { 134,   "Router Advertisement" },
    { 135,   "Neighbor Solicitation" },
    { 136,   "Neighbor Advertisement" },
    { 137,   "Redirect Message" },
    { 138,   "Router Renumbering" },
    { 139,   "ICMP Node Information Query" },
    { 140,   "ICMP Node Information Response" },
    { 141,   "Inverse Neighbor Discovery Solicitation Message" },
    { 142,   "Inverse Neighbor Discovery Advertisement Message" },
    { 143,   "Version 2 Multicast Listener Report" },
    { 144,   "Home Agent Address Discovery Request Message" },
    { 145,   "Home Agent Address Discovery Reply Message" },
    { 146,   "Mobile Prefix Solicitation" },
    { 147,   "Mobile Prefix Advertisement" },
    { 148,   "Certification Path Solicitation Message" },
    { 149,   "Certification Path Advertisement Message" },
    { 151,   "Multicast Router Advertisement" },
    { 152,   "Multicast Router Solicitation" },
    { 153,   "Multicast Router Termination" },
    { 154,   "FMIPv6 Messages" },
    { 155,   "RPL Control Message" },
    { 0 }
};


void
tcpxprotopr(const char *name)
{
    netsnmp_variable_list *var, *vp, *pvar;
    oid    tcpConnectionState_oid[] = { 1,3,6,1,2,1,6,19,1,7 };
    size_t tcpConnectionState_len   = OID_LENGTH( tcpConnectionState_oid );
    int    state, i;
    struct sockaddr_in6 localAddr, remoteAddr;
    int    localPort,     remotePort,  pid = 0;
    int    localType,    remoteType, inx;
    int    first = 1;
    static int done = 0;

    if (done++) return;

    /*
     * Walking the v6 tcpConnectionState column will provide all
     *   the necessary information.
     */
    var = NULL;
    snmp_varlist_add_variable( &var, tcpConnectionState_oid,
                                     tcpConnectionState_len,
                                     ASN_NULL, NULL,  0);
    if (netsnmp_query_walk( var, ss ) != SNMP_ERR_NOERROR)
        return;
    if ((var->type & 0xF0) == 0x80)	/* Exception */
        return;

    for (vp = var; vp ; vp=vp->next_variable) {
	char lname[5];
        state = *vp->val.integer;
	inx = tcpConnectionState_len;
	pvar = NULL;

	vp->name[inx-1] = 8;
	snmp_varlist_add_variable( &pvar, vp->name, vp->name_length,
					 ASN_NULL, NULL,  0);
	if (netsnmp_query_get( pvar, ss ) != SNMP_ERR_NOERROR) {
	    snmp_free_var( pvar );
	    return;
	}
	if ((pvar->type & 0xF0) != 0x80)	/* Exception */
	    pid = *pvar->val.integer;
        
        /* Extract the local/remote information from the index values */
	localType = vp->name[inx++];
	for (i = 0; i < vp->name[inx]; i++)
	    localAddr.sin6_addr.s6_addr[i] = vp->name[inx+i+1];
	inx += vp->name[inx] + 1;
        localPort    = vp->name[inx++];
	remoteType = vp->name[inx++];
	for (i = 0; i < vp->name[inx]; i++)
	    remoteAddr.sin6_addr.s6_addr[i] = vp->name[inx+i+1];
	inx += vp->name[inx] + 1;
        remotePort    = vp->name[inx++];

	snmp_free_varbind(pvar);

	if (af == AF_INET && localType == 2) continue;
	if (af == AF_INET6 && localType != 2) continue;

        if (first) {
            printf("Active Internet (%s) Connections", name);
            putchar('\n');
            printf("%-5.5s %-27.27s %-27.27s %11.11s %5.5s\n",
                   "Proto", "Local Address", "Remote Address", "State", "PID");
            first = 0;
        }

	strcpy(lname, name);
	if (localType == 2) lname[3] = '6';
	else lname[3] = '4';
	lname[4] = 0;
        printf("%-5.5s", lname);
        inetxprint(localType, localAddr,  localPort, name, 1);
        inetxprint(remoteType, remoteAddr, remotePort, name, 0);
        if ( state < 1 || state > TCP_NSTATES )
            printf(" %11d %5d\n", state, pid);
        else
            printf(" %11s %5d\n", tcpxstates[ state ], pid);
    }
    snmp_free_varbind( var );

    if (aflag)
	listenxprotopr(name);
}

/*
 * Print a summary of listening "connections"
 */
void
listenxprotopr(const char *name)
{
    netsnmp_variable_list *var, *vp;
    oid    tcpListenerProcess_oid[] = { 1,3,6,1,2,1,6,20,1,4 };
    size_t tcpListenerProcess_len   = OID_LENGTH( tcpListenerProcess_oid );
    struct sockaddr_in6 localAddr;
    int    localType, localPort, pid;
    int    i, inx;

    /*
     * Walking a single column of the udpTable will provide
     *   all the necessary information from the index values.
     */
    var = NULL;
    snmp_varlist_add_variable( &var, tcpListenerProcess_oid,
                                     tcpListenerProcess_len,
                                     ASN_NULL, NULL,  0);
    if (netsnmp_query_walk( var, ss ) != SNMP_ERR_NOERROR)
        return;
    if ((var->type & 0xF0) == 0x80)	/* Exception */
        return;

    printf("Listening Internet (%s) Connections\n", name);
    printf("%-5.5s %-27.27s %5s\n", "Proto", "Local Address", "PID");
    for (vp = var; vp ; vp=vp->next_variable) {
	char lname[5];
	inx = tcpListenerProcess_len;
        /*
         * Extract the local port from the index values, but take
         *   the IP address from the varbind value, (which is why
         *   we walked udpLocalAddress rather than udpLocalPort)
         */
	localType = vp->name[inx++];
	if (af == AF_INET && localType == 2) continue;
	if (af == AF_INET6 && localType != 2) continue;

	for (i = 0; i < vp->name[inx]; i++)
	    localAddr.sin6_addr.s6_addr[i] = vp->name[inx+i+1];
	inx += vp->name[inx]+1;
        localPort = vp->name[ inx++ ];
        pid   = *vp->val.integer;
	strcpy(lname, name);
	if (localType == 2) lname[3] = '6';
	else lname[3] = '4';
	lname[4] = 0;
        printf("%-5.5s", lname);
        inetxprint(localType, localAddr, localPort, name, 1);
        printf(" %5d\n", pid);
    }
    snmp_free_varbind( var );
}

/*
 * Print a summary of UDPv6 "connections"
 *    XXX - what about "listening" services ??
 */
void
udpxprotopr(const char *name)
{
    netsnmp_variable_list *var, *vp;
    oid    udpEndpointProcess_oid[] = { 1,3,6,1,2,1,7,7,1,8 };
    size_t udpEndpointProcess_len   = OID_LENGTH( udpEndpointProcess_oid );
    struct sockaddr_in6 localAddr, remoteAddr;
    int    localType, remoteType, localPort, remotePort, pid;
    int    i, inx;
    static int done = 0;

    if (done++) return;

    /*
     * Walking a single column of the udpTable will provide
     *   all the necessary information from the index values.
     */
    var = NULL;
    snmp_varlist_add_variable( &var, udpEndpointProcess_oid,
                                     udpEndpointProcess_len,
                                     ASN_NULL, NULL,  0);
    if (netsnmp_query_walk( var, ss ) != SNMP_ERR_NOERROR)
        return;
    if ((var->type & 0xF0) == 0x80)	/* Exception */
        return;

    printf("Active Internet (%s) Connections\n", name);
    printf("%-5.5s %-27.27s %-27.27s %5s\n", "Proto", "Local Address", "Remote Address", "PID");
    for (vp = var; vp ; vp=vp->next_variable) {
        char lname[5];
	inx = udpEndpointProcess_len;
        /*
         * Extract the local port from the index values, but take
         *   the IP address from the varbind value, (which is why
         *   we walked udpLocalAddress rather than udpLocalPort)
         */
	localType = vp->name[inx++];
	if (af == AF_INET && localType == 2) continue;
	if (af == AF_INET6 && localType != 2) continue;
	for (i = 0; i < vp->name[inx]; i++)
	    localAddr.sin6_addr.s6_addr[i] = vp->name[inx+i+1];
	inx += vp->name[inx]+1;
        localPort = vp->name[ inx++ ];
	remoteType = vp->name[inx++];
	for (i = 0; i < vp->name[inx]; i++)
	    remoteAddr.sin6_addr.s6_addr[i] = vp->name[inx+i+1];
	inx += vp->name[inx]+1;
        remotePort = vp->name[ inx++ ];
        pid   = *vp->val.integer;
	strcpy(lname, name);
	if (localType == 2) lname[3] = '6';
	else lname[3] = '4';
	lname[4] = 0;
        printf("%-5.5s", lname);
        inetxprint(localType, localAddr, localPort, name, 1);
        inetxprint(remoteType, remoteAddr, remotePort, name, 1);
        printf(" %5d\n", pid);
    }
    snmp_free_varbind( var );
}

static void
statsprint(const char *name, const systemstats_t *st, int proto,
	const oid *tbl, size_t tbllen)
{
    oid var[32];
    size_t len;
    netsnmp_variable_list *vb;

    memcpy(var, tbl, tbllen*sizeof(oid));
    var[tbllen+1] = proto;
    len = tbllen+2;

    printf("%s:\n", name);
    while (st->stat) {
	vb = NULL;
	if (st->hcstat) {
	    var[tbllen] = st->hcstat;
	    snmp_varlist_add_variable( &vb, var, len, ASN_NULL, NULL,  0);
	    if (netsnmp_query_get( vb, ss ) != SNMP_ERR_NOERROR) {
		snmp_free_var( vb );
		vb = NULL;
	    }
	}
	if (!vb) {
	    var[tbllen] = st->stat;
	    snmp_varlist_add_variable( &vb, var, len, ASN_NULL, NULL, 0);
	    if (netsnmp_query_get( vb, ss ) != SNMP_ERR_NOERROR) {
		snmp_free_var( vb );
		return;
	    }
	}
	if (vb) {
	    if (vb->type == ASN_COUNTER) {
		if (*vb->val.integer > 0 || sflag == 1)
		    printf("%14lu %s\n", *vb->val.integer, st->str);
	    }
	    else if (vb->type == ASN_COUNTER64) {
		char a64buf[I64CHARSZ + 1];
		printU64(a64buf, vb->val.counter64);
		if (strcmp(a64buf, "0") != 0 || sflag == 1)
		    printf("%14s %s\n", a64buf, st->str);
	    }
	    else
		printf("%14s %s\n", "-", st->str);
	    snmp_free_varbind(vb);
	}
	st++;
    }
}

static void
prhisto(const char *name, const oid *var, size_t len, int ver, codelist_t *cs)
{
    netsnmp_variable_list *vb = NULL, *vp;
    codelist_t *cp;
    int code;
    char nocode[32];

    snmp_varlist_add_variable( &vb, var, len, ASN_NULL, NULL,  0);
    if (netsnmp_query_walk( vb, ss ) != SNMP_ERR_NOERROR) {
	snmp_free_var( vb );
	return;
    }
    printf("     %s histogram:\n", name);
    printf("     %10s %10s %s\n", "input", "output", "type");
    for (code = 0; code < 256; code++) {
	unsigned long inp = 0, out = 0;
	int found = 0;
	vp = vb;
	while (vp && found != 2) {
	    if (vp->name[11] == code && vp->name[10] == ver) {
		if (vp->name[9] == 3) inp = *vp->val.integer;
		else out = *vp->val.integer;
		found++;
	    }
	    vp = vp->next_variable;
	}
	if (found) {
	    cp = cs;
	    while (cp->name && cp->code != code) cp++;
	    if (inp || out || sflag == 1) {
		if (!cp->code)
		    snprintf(nocode, sizeof nocode, "type %d", code);
		printf("     %10lu %10lu %s\n", inp, out, cp->name ? cp->name : nocode);
	    }
	}
    }
    snmp_free_varbind(vb);
}

void
ipx_stats(const char *name)
{
    oid ipsysstat_oid[] = { 1, 3, 6, 1, 2, 1, 4, 31, 1, 1 };
    size_t ipsysstat_len = sizeof(ipsysstat_oid) / sizeof(ipsysstat_oid[0]);
    statsprint("ip4", systemstats, 1, ipsysstat_oid, ipsysstat_len);
    statsprint("ip6", systemstats, 2, ipsysstat_oid, ipsysstat_len);
}

void
icmpx_stats(const char *name)
{
    oid icmpstat_oid[] = { 1, 3, 6, 1, 2, 1, 5, 29, 1 };
    size_t icmpstat_len = sizeof(icmpstat_oid) / sizeof(icmpstat_oid[0]);
    oid icmpmsg_oid[] = { 1, 3, 6, 1, 2, 1, 5, 30, 1 };
    size_t icmpmsg_len = sizeof(icmpmsg_oid) / sizeof(icmpmsg_oid[0]);
    statsprint("icmp4", icmpstats, 1, icmpstat_oid, icmpstat_len);
    prhisto("icmp4", icmpmsg_oid, icmpmsg_len, 1, icmpcodes);
    statsprint("icmp6", icmpstats, 2, icmpstat_oid, icmpstat_len);
    prhisto("icmp6", icmpmsg_oid, icmpmsg_len, 2, icmp6codes);
}


static void
unknownprint(void)
{
    char line[80], *cp;
    int width = 27;

    if (vflag)
	snprintf(line, sizeof line, "%s.", "*");
    else
	snprintf(line, sizeof line, "%.*s.", width-9, "*");
    cp = strchr(line, '\0');
    snprintf(cp, line + sizeof line - cp, vflag ? "%s" : "%.8s", "*");
    if (vflag && width < strlen(line))
	width = strlen(line);
    printf(" %-*.*s", width, width, line);
}

/*
 * Pretty print an Internet address (net address + port).
 * If the nflag was specified, use numbers instead of names.
 */

void
inetxprint(int proto, struct sockaddr_in6 in6, int port, const char *name, int local)
{

	if (proto == 2)
	    inet6print((u_char *)&in6.sin6_addr.s6_addr, port, name, local);
	else if (proto == 1)
	    inetprint((struct in_addr *)&in6.sin6_addr.s6_addr, port, name, local);
	else if (proto == 0)
	    unknownprint();
	else abort();
}
