/*
 *	PPPDUMP.C
 *
 *	12-89	-- Katie Stevens (dkstevens@ucdavis.edu)
 *		   UC Davis, Computing Services
 *	PPP.08	05-90	[ks] improve tracing reports
 *	PPP.09  05-90	[ks] add UPAP packet reporting
 *	PPP.14	08-90	[ks] change UPAP to PAP for consistency with RFC1172
 *	PPP.15	09-90	[ks] update to KA9Q NOS v900828
 *	Jan 91	[Bill Simpson] small changes to match rewrite of PPP
 *	Aug 91	[Bill Simpson] fixed some buffer loss
 */
#include "global.h"
#ifdef PPP
#include "mbuf.h"
#include "iface.h"
#include "ppp.h"
#include "trace.h"

#if !defined(_lint)
static char rcsid[] OPTIONAL = "$Id: pppdump.c,v 1.10 1996/08/29 12:11:16 root Exp $";
#endif


/* dump a PPP packet */
void
ppp_dump (fp, bpp, unused)
FILE *fp;
struct mbuf **bpp;
int unused OPTIONAL;
{
struct ppp_hdr hdr;
struct mbuf *tbp;

	traceprintf (fp, "PPP: len %3u\t", len_p (*bpp));

	/* HDLC address and control fields may be compressed out */
	if ((byte_t) (*bpp)->data[0] != HDLC_ALL_ADDR) {
		traceprintf (fp, "(compressed ALL/UI)\t");
	} else if ((byte_t) (*bpp)->data[1] != HDLC_UI) {
		traceprintf (fp, "(missing UI!)\t");
	} else {
		/* skip address/control fields */
		(void) pull16 (bpp);
	}

	/* Initialize the expected header */
	hdr.addr = HDLC_ALL_ADDR;
	hdr.control = HDLC_UI;
	hdr.protocol = (int16) PULLCHAR (bpp);

	/* First byte of PPP protocol field may be compressed out */
	if (hdr.protocol & 0x01)
		traceprintf (fp, "compressed ");
	else {
		hdr.protocol = (int16) ((hdr.protocol << 8) | PULLCHAR (bpp));

		/* Second byte of PPP protocol field must be odd */
		if (!(hdr.protocol & 0x01))
			traceprintf (fp, "(not odd!) ");
	}

	traceprintf (fp, "protocol: ");
	switch (hdr.protocol) {
		case PPP_IP_PROTOCOL:
			traceprintf (fp, "IP\n");
			ip_dump (fp, bpp, 1);
			break;
		case PPP_IPCP_PROTOCOL:
			traceprintf (fp, "IPCP\n");
			break;
		case PPP_LCP_PROTOCOL:
			traceprintf (fp, "LCP\n");
			break;
		case PPP_PAP_PROTOCOL:
			traceprintf (fp, "PAP\n");
			break;
		case PPP_COMPR_PROTOCOL:
			traceprintf (fp, "VJ Compressed TCP/IP\n");
			vjcomp_dump (fp, bpp, 0);
			break;
		case PPP_UNCOMP_PROTOCOL:
			traceprintf (fp, "VJ Uncompressed TCP/IP\n");
			/* Get our own copy so we can mess with the data */
			if (bpp && (tbp = copy_p (*bpp, len_p (*bpp))) == NULLBUF)
				return;

			traceprintf (fp, "\tconnection 0x%02x\n",
				     tbp->data[9]);	/* FIX THIS! */
			/* Restore the bytes used with Uncompressed TCP */
			tbp->data[9] = TCP_PTCL;	/* FIX THIS! */
			ip_dump (fp, &tbp, 1);
			free_p (tbp);
			break;
		default:
			traceprintf (fp, "unknown 0x%04x\n", hdr.protocol);
			break;
	}
}


#endif /* PPP */
