summaryrefslogtreecommitdiffstats
path: root/contrib/tcpdump
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/tcpdump')
-rw-r--r--contrib/tcpdump/FREEBSD-upgrade28
-rw-r--r--contrib/tcpdump/addrtoname.c37
-rw-r--r--contrib/tcpdump/ethertype.h3
-rw-r--r--contrib/tcpdump/nfs.h446
-rw-r--r--contrib/tcpdump/nfsfh.h6
-rw-r--r--contrib/tcpdump/nfsv2.h262
-rw-r--r--contrib/tcpdump/parsenfsfh.c56
-rw-r--r--contrib/tcpdump/print-arp.c7
-rw-r--r--contrib/tcpdump/print-atalk.c41
-rw-r--r--contrib/tcpdump/print-atm.c6
-rw-r--r--contrib/tcpdump/print-bootp.c6
-rw-r--r--contrib/tcpdump/print-domain.c8
-rw-r--r--contrib/tcpdump/print-ether.c12
-rw-r--r--contrib/tcpdump/print-fddi.c8
-rw-r--r--contrib/tcpdump/print-icmp.c8
-rw-r--r--contrib/tcpdump/print-ip.c74
-rw-r--r--contrib/tcpdump/print-ipx.c17
-rw-r--r--contrib/tcpdump/print-isoclns.c338
-rw-r--r--contrib/tcpdump/print-llc.c10
-rw-r--r--contrib/tcpdump/print-nfs.c1320
-rw-r--r--contrib/tcpdump/print-ntp.c8
-rw-r--r--contrib/tcpdump/print-null.c14
-rw-r--r--contrib/tcpdump/print-ppp.c78
-rw-r--r--contrib/tcpdump/print-sl.c9
-rw-r--r--contrib/tcpdump/print-sunrpc.c6
-rw-r--r--contrib/tcpdump/print-udp.c182
-rw-r--r--contrib/tcpdump/tcpdump.169
27 files changed, 2119 insertions, 940 deletions
diff --git a/contrib/tcpdump/FREEBSD-upgrade b/contrib/tcpdump/FREEBSD-upgrade
new file mode 100644
index 0000000..061fa50
--- /dev/null
+++ b/contrib/tcpdump/FREEBSD-upgrade
@@ -0,0 +1,28 @@
+This directory contains virgin copies of the original distribution files
+on a "vendor" branch. Do not, under any circumstances, attempt to upgrade
+the files in this directory via patches and a cvs commit.
+
+To upgrade to a newer version of tcpdump, when it is available:
+ 1. Unpack the new version into an empty directory.
+ [Do not make ANY changes to the files.]
+
+ 2. Use the command:
+ cvs import -m 'Virgin import of LBL tcpdump v<version>' \
+ src/contrib/tcpdump LBL v<version>
+
+ For example, to do the import of version 3.2.1, I typed:
+ cvs import -m 'Virgin import of LBL tcpdump v3.2.1' \
+ src/contrib/tcpdump LBL v3_2_1
+
+ 3. Follow the instructions printed out in step 2 to resolve any
+ conflicts between local FreeBSD changes and the newer version.
+
+Do not, under any circumstances, deviate from this procedure.
+
+To make local changes to tcpdump, simply patch and commit to the main
+branch (aka HEAD). Never make local changes on the LBL branch.
+
+All local changes should be submitted to "tcpdump@ee.lbl.gov" for
+inclusion in the next vendor release.
+
+pst@freebsd.org - 19 Aug 1996
diff --git a/contrib/tcpdump/addrtoname.c b/contrib/tcpdump/addrtoname.c
index fbeb2c1..11d150f 100644
--- a/contrib/tcpdump/addrtoname.c
+++ b/contrib/tcpdump/addrtoname.c
@@ -22,8 +22,8 @@
* and address to string conversion routines
*/
#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: addrtoname.c,v 1.54 96/12/05 22:10:19 leres Exp $ (LBL)";
+static char rcsid[] =
+ "@(#) $Header: addrtoname.c,v 1.49 96/07/02 00:19:35 leres Exp $ (LBL)";
#endif
#include <sys/types.h>
@@ -37,7 +37,7 @@ struct rtentry;
#include <net/if.h>
#include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <net/ethernet.h>
#include <arpa/inet.h>
@@ -164,7 +164,7 @@ getname(const u_char *ap)
addr = *(const u_int32_t *)ap;
#else
/*
- * Extract 32 bits in network order, dealing with alignment.
+ * Deal with alignment.
*/
switch ((long)ap & 3) {
@@ -173,26 +173,26 @@ getname(const u_char *ap)
break;
case 2:
-#ifdef WORDS_BIGENDIAN
- addr = ((u_int32_t)*(u_short *)ap << 16) |
- (u_int32_t)*(u_short *)(ap + 2);
-#else
+#if BYTE_ORDER == LITTLE_ENDIAN
addr = ((u_int32_t)*(u_short *)(ap + 2) << 16) |
(u_int32_t)*(u_short *)ap;
+#else
+ addr = ((u_int32_t)*(u_short *)ap << 16) |
+ (u_int32_t)*(u_short *)(ap + 2);
#endif
break;
default:
-#ifdef WORDS_BIGENDIAN
- addr = ((u_int32_t)ap[0] << 24) |
- ((u_int32_t)ap[1] << 16) |
- ((u_int32_t)ap[2] << 8) |
- (u_int32_t)ap[3];
-#else
+#if BYTE_ORDER == LITTLE_ENDIAN
addr = ((u_int32_t)ap[3] << 24) |
((u_int32_t)ap[2] << 16) |
((u_int32_t)ap[1] << 8) |
(u_int32_t)ap[0];
+#else
+ addr = ((u_int32_t)ap[0] << 24) |
+ ((u_int32_t)ap[1] << 16) |
+ ((u_int32_t)ap[2] << 8) |
+ (u_int32_t)ap[3];
#endif
break;
}
@@ -467,15 +467,16 @@ isonsap_string(const u_char *nsap)
if (tp->e_name)
return tp->e_name;
- tp->e_name = cp = (char *)malloc(nlen * 2 + 2);
+ tp->e_name = cp = (char *)malloc(nlen * 2 + 2 + (nlen>>1));
if (cp == NULL)
error("isonsap_string: malloc");
nsap++;
- *cp++ = '/';
- for (i = nlen; (int)--i >= 0;) {
+ for (i = 0; i < nlen; i++) {
*cp++ = hex[*nsap >> 4];
*cp++ = hex[*nsap++ & 0xf];
+ if (((i & 1) == 0) && (i + 1 < nlen))
+ *cp++ = '.';
}
*cp = '\0';
return (tp->e_name);
@@ -738,7 +739,7 @@ dnaddr_string(u_short dnaddr)
/* Return a zero'ed hnamemem struct and cuts down on calloc() overhead */
struct hnamemem *
-newhnamemem(void)
+newhnamemem()
{
register struct hnamemem *p;
static struct hnamemem *ptr = NULL;
diff --git a/contrib/tcpdump/ethertype.h b/contrib/tcpdump/ethertype.h
index 2403073..1d62670 100644
--- a/contrib/tcpdump/ethertype.h
+++ b/contrib/tcpdump/ethertype.h
@@ -71,6 +71,9 @@
#ifndef ETHERTYPE_AARP
#define ETHERTYPE_AARP 0x80f3
#endif
+#ifndef ETHERTYPE_IPX
+#define ETHERTYPE_IPX 0x8137
+#endif
#ifndef ETHERTYPE_LOOPBACK
#define ETHERTYPE_LOOPBACK 0x9000
#endif
diff --git a/contrib/tcpdump/nfs.h b/contrib/tcpdump/nfs.h
new file mode 100644
index 0000000..045ebb1
--- /dev/null
+++ b/contrib/tcpdump/nfs.h
@@ -0,0 +1,446 @@
+/* $NetBSD: nfs.h,v 1.1 1996/05/23 22:49:53 fvdl Exp $ */
+
+/*
+ * Copyright (c) 1989, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Rick Macklem at The University of Guelph.
+ *
+ * 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. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. 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.
+ *
+ * @(#)nfsproto.h 8.2 (Berkeley) 3/30/95
+ */
+
+/*
+ * nfs definitions as per the Version 2 and 3 specs
+ */
+
+/*
+ * Constants as defined in the Sun NFS Version 2 and 3 specs.
+ * "NFS: Network File System Protocol Specification" RFC1094
+ * and in the "NFS: Network File System Version 3 Protocol
+ * Specification"
+ */
+
+#define NFS_PORT 2049
+#define NFS_PROG 100003
+#define NFS_VER2 2
+#define NFS_VER3 3
+#define NFS_V2MAXDATA 8192
+#define NFS_MAXDGRAMDATA 16384
+#define NFS_MAXDATA 32768
+#define NFS_MAXPATHLEN 1024
+#define NFS_MAXNAMLEN 255
+#define NFS_MAXPKTHDR 404
+#define NFS_MAXPACKET (NFS_MAXPKTHDR + NFS_MAXDATA)
+#define NFS_MINPACKET 20
+#define NFS_FABLKSIZE 512 /* Size in bytes of a block wrt fa_blocks */
+
+/* Stat numbers for rpc returns (version 2 and 3) */
+#define NFS_OK 0
+#define NFSERR_PERM 1
+#define NFSERR_NOENT 2
+#define NFSERR_IO 5
+#define NFSERR_NXIO 6
+#define NFSERR_ACCES 13
+#define NFSERR_EXIST 17
+#define NFSERR_XDEV 18 /* Version 3 only */
+#define NFSERR_NODEV 19
+#define NFSERR_NOTDIR 20
+#define NFSERR_ISDIR 21
+#define NFSERR_INVAL 22 /* Version 3 only */
+#define NFSERR_FBIG 27
+#define NFSERR_NOSPC 28
+#define NFSERR_ROFS 30
+#define NFSERR_MLINK 31 /* Version 3 only */
+#define NFSERR_NAMETOL 63
+#define NFSERR_NOTEMPTY 66
+#define NFSERR_DQUOT 69
+#define NFSERR_STALE 70
+#define NFSERR_REMOTE 71 /* Version 3 only */
+#define NFSERR_WFLUSH 99 /* Version 2 only */
+#define NFSERR_BADHANDLE 10001 /* The rest Version 3 only */
+#define NFSERR_NOT_SYNC 10002
+#define NFSERR_BAD_COOKIE 10003
+#define NFSERR_NOTSUPP 10004
+#define NFSERR_TOOSMALL 10005
+#define NFSERR_SERVERFAULT 10006
+#define NFSERR_BADTYPE 10007
+#define NFSERR_JUKEBOX 10008
+#define NFSERR_TRYLATER NFSERR_JUKEBOX
+#define NFSERR_STALEWRITEVERF 30001 /* Fake return for nfs_commit() */
+
+#define NFSERR_RETVOID 0x20000000 /* Return void, not error */
+#define NFSERR_AUTHERR 0x40000000 /* Mark an authentication error */
+#define NFSERR_RETERR 0x80000000 /* Mark an error return for V3 */
+
+/* Sizes in bytes of various nfs rpc components */
+#define NFSX_UNSIGNED 4
+
+/* specific to NFS Version 2 */
+#define NFSX_V2FH 32
+#define NFSX_V2FATTR 68
+#define NFSX_V2SATTR 32
+#define NFSX_V2COOKIE 4
+#define NFSX_V2STATFS 20
+
+/* specific to NFS Version 3 */
+#if 0
+#define NFSX_V3FH (sizeof (fhandle_t)) /* size this server uses */
+#endif
+#define NFSX_V3FHMAX 64 /* max. allowed by protocol */
+#define NFSX_V3FATTR 84
+#define NFSX_V3SATTR 60 /* max. all fields filled in */
+#define NFSX_V3SRVSATTR (sizeof (struct nfsv3_sattr))
+#define NFSX_V3POSTOPATTR (NFSX_V3FATTR + NFSX_UNSIGNED)
+#define NFSX_V3WCCDATA (NFSX_V3POSTOPATTR + 8 * NFSX_UNSIGNED)
+#define NFSX_V3COOKIEVERF 8
+#define NFSX_V3WRITEVERF 8
+#define NFSX_V3CREATEVERF 8
+#define NFSX_V3STATFS 52
+#define NFSX_V3FSINFO 48
+#define NFSX_V3PATHCONF 24
+
+/* variants for both versions */
+#define NFSX_FH(v3) ((v3) ? (NFSX_V3FHMAX + NFSX_UNSIGNED) : \
+ NFSX_V2FH)
+#define NFSX_SRVFH(v3) ((v3) ? NFSX_V3FH : NFSX_V2FH)
+#define NFSX_FATTR(v3) ((v3) ? NFSX_V3FATTR : NFSX_V2FATTR)
+#define NFSX_PREOPATTR(v3) ((v3) ? (7 * NFSX_UNSIGNED) : 0)
+#define NFSX_POSTOPATTR(v3) ((v3) ? (NFSX_V3FATTR + NFSX_UNSIGNED) : 0)
+#define NFSX_POSTOPORFATTR(v3) ((v3) ? (NFSX_V3FATTR + NFSX_UNSIGNED) : \
+ NFSX_V2FATTR)
+#define NFSX_WCCDATA(v3) ((v3) ? NFSX_V3WCCDATA : 0)
+#define NFSX_WCCORFATTR(v3) ((v3) ? NFSX_V3WCCDATA : NFSX_V2FATTR)
+#define NFSX_SATTR(v3) ((v3) ? NFSX_V3SATTR : NFSX_V2SATTR)
+#define NFSX_COOKIEVERF(v3) ((v3) ? NFSX_V3COOKIEVERF : 0)
+#define NFSX_WRITEVERF(v3) ((v3) ? NFSX_V3WRITEVERF : 0)
+#define NFSX_READDIR(v3) ((v3) ? (5 * NFSX_UNSIGNED) : \
+ (2 * NFSX_UNSIGNED))
+#define NFSX_STATFS(v3) ((v3) ? NFSX_V3STATFS : NFSX_V2STATFS)
+
+/* nfs rpc procedure numbers (before version mapping) */
+#define NFSPROC_NULL 0
+#define NFSPROC_GETATTR 1
+#define NFSPROC_SETATTR 2
+#define NFSPROC_LOOKUP 3
+#define NFSPROC_ACCESS 4
+#define NFSPROC_READLINK 5
+#define NFSPROC_READ 6
+#define NFSPROC_WRITE 7
+#define NFSPROC_CREATE 8
+#define NFSPROC_MKDIR 9
+#define NFSPROC_SYMLINK 10
+#define NFSPROC_MKNOD 11
+#define NFSPROC_REMOVE 12
+#define NFSPROC_RMDIR 13
+#define NFSPROC_RENAME 14
+#define NFSPROC_LINK 15
+#define NFSPROC_READDIR 16
+#define NFSPROC_READDIRPLUS 17
+#define NFSPROC_FSSTAT 18
+#define NFSPROC_FSINFO 19
+#define NFSPROC_PATHCONF 20
+#define NFSPROC_COMMIT 21
+
+/* And leasing (nqnfs) procedure numbers (must be last) */
+#define NQNFSPROC_GETLEASE 22
+#define NQNFSPROC_VACATED 23
+#define NQNFSPROC_EVICTED 24
+
+#define NFSPROC_NOOP 25
+#define NFS_NPROCS 26
+
+/* Actual Version 2 procedure numbers */
+#define NFSV2PROC_NULL 0
+#define NFSV2PROC_GETATTR 1
+#define NFSV2PROC_SETATTR 2
+#define NFSV2PROC_NOOP 3
+#define NFSV2PROC_ROOT NFSV2PROC_NOOP /* Obsolete */
+#define NFSV2PROC_LOOKUP 4
+#define NFSV2PROC_READLINK 5
+#define NFSV2PROC_READ 6
+#define NFSV2PROC_WRITECACHE NFSV2PROC_NOOP /* Obsolete */
+#define NFSV2PROC_WRITE 8
+#define NFSV2PROC_CREATE 9
+#define NFSV2PROC_REMOVE 10
+#define NFSV2PROC_RENAME 11
+#define NFSV2PROC_LINK 12
+#define NFSV2PROC_SYMLINK 13
+#define NFSV2PROC_MKDIR 14
+#define NFSV2PROC_RMDIR 15
+#define NFSV2PROC_READDIR 16
+#define NFSV2PROC_STATFS 17
+
+/*
+ * Constants used by the Version 3 protocol for various RPCs
+ */
+#define NFSV3SATTRTIME_DONTCHANGE 0
+#define NFSV3SATTRTIME_TOSERVER 1
+#define NFSV3SATTRTIME_TOCLIENT 2
+
+#define NFSV3ATTRTIME_NMODES 3
+
+#define NFSV3ACCESS_READ 0x01
+#define NFSV3ACCESS_LOOKUP 0x02
+#define NFSV3ACCESS_MODIFY 0x04
+#define NFSV3ACCESS_EXTEND 0x08
+#define NFSV3ACCESS_DELETE 0x10
+#define NFSV3ACCESS_EXECUTE 0x20
+
+#define NFSV3WRITE_UNSTABLE 0
+#define NFSV3WRITE_DATASYNC 1
+#define NFSV3WRITE_FILESYNC 2
+
+#define NFSV3WRITE_NMODES 3
+
+#define NFSV3CREATE_UNCHECKED 0
+#define NFSV3CREATE_GUARDED 1
+#define NFSV3CREATE_EXCLUSIVE 2
+
+#define NFSV3CREATE_NMODES 3
+
+#define NFSV3FSINFO_LINK 0x01
+#define NFSV3FSINFO_SYMLINK 0x02
+#define NFSV3FSINFO_HOMOGENEOUS 0x08
+#define NFSV3FSINFO_CANSETTIME 0x10
+
+/* Conversion macros */
+#define vtonfsv2_mode(t,m) \
+ txdr_unsigned(((t) == VFIFO) ? MAKEIMODE(VCHR, (m)) : \
+ MAKEIMODE((t), (m)))
+#define vtonfsv3_mode(m) txdr_unsigned((m) & 07777)
+#define nfstov_mode(a) (fxdr_unsigned(u_int16_t, (a))&07777)
+#define vtonfsv2_type(a) txdr_unsigned(nfsv2_type[((int32_t)(a))])
+#define vtonfsv3_type(a) txdr_unsigned(nfsv3_type[((int32_t)(a))])
+#define nfsv2tov_type(a) nv2tov_type[fxdr_unsigned(u_int32_t,(a))&0x7]
+#define nfsv3tov_type(a) nv3tov_type[fxdr_unsigned(u_int32_t,(a))&0x7]
+
+/* File types */
+typedef enum { NFNON=0, NFREG=1, NFDIR=2, NFBLK=3, NFCHR=4, NFLNK=5,
+ NFSOCK=6, NFFIFO=7 } nfstype;
+
+/* Structs for common parts of the rpc's */
+/*
+ * File Handle (32 bytes for version 2), variable up to 64 for version 3.
+ * File Handles of up to NFS_SMALLFH in size are stored directly in the
+ * nfs node, whereas larger ones are malloc'd. (This never happens when
+ * NFS_SMALLFH is set to 64.)
+ * NFS_SMALLFH should be in the range of 32 to 64 and be divisible by 4.
+ */
+#ifndef NFS_SMALLFH
+#define NFS_SMALLFH 64
+#endif
+union nfsfh {
+/* fhandle_t fh_generic; */
+ u_char fh_bytes[NFS_SMALLFH];
+};
+typedef union nfsfh nfsfh_t;
+
+struct nfsv2_time {
+ u_int32_t nfsv2_sec;
+ u_int32_t nfsv2_usec;
+};
+typedef struct nfsv2_time nfstime2;
+
+struct nfsv3_time {
+ u_int32_t nfsv3_sec;
+ u_int32_t nfsv3_nsec;
+};
+typedef struct nfsv3_time nfstime3;
+
+/*
+ * Quads are defined as arrays of 2 longs to ensure dense packing for the
+ * protocol and to facilitate xdr conversion.
+ */
+struct nfs_uquad {
+ u_int32_t nfsuquad[2];
+};
+typedef struct nfs_uquad nfsuint64;
+
+/*
+ * Used to convert between two u_longs and a u_quad_t.
+ */
+union nfs_quadconvert {
+ u_int32_t lval[2];
+ u_quad_t qval;
+};
+typedef union nfs_quadconvert nfsquad_t;
+
+/*
+ * NFS Version 3 special file number.
+ */
+struct nfsv3_spec {
+ u_int32_t specdata1;
+ u_int32_t specdata2;
+};
+typedef struct nfsv3_spec nfsv3spec;
+
+/*
+ * File attributes and setable attributes. These structures cover both
+ * NFS version 2 and the version 3 protocol. Note that the union is only
+ * used so that one pointer can refer to both variants. These structures
+ * go out on the wire and must be densely packed, so no quad data types
+ * are used. (all fields are longs or u_longs or structures of same)
+ * NB: You can't do sizeof(struct nfs_fattr), you must use the
+ * NFSX_FATTR(v3) macro.
+ */
+struct nfs_fattr {
+ u_int32_t fa_type;
+ u_int32_t fa_mode;
+ u_int32_t fa_nlink;
+ u_int32_t fa_uid;
+ u_int32_t fa_gid;
+ union {
+ struct {
+ u_int32_t nfsv2fa_size;
+ u_int32_t nfsv2fa_blocksize;
+ u_int32_t nfsv2fa_rdev;
+ u_int32_t nfsv2fa_blocks;
+ u_int32_t nfsv2fa_fsid;
+ u_int32_t nfsv2fa_fileid;
+ nfstime2 nfsv2fa_atime;
+ nfstime2 nfsv2fa_mtime;
+ nfstime2 nfsv2fa_ctime;
+ } fa_nfsv2;
+ struct {
+ nfsuint64 nfsv3fa_size;
+ nfsuint64 nfsv3fa_used;
+ nfsv3spec nfsv3fa_rdev;
+ nfsuint64 nfsv3fa_fsid;
+ nfsuint64 nfsv3fa_fileid;
+ nfstime3 nfsv3fa_atime;
+ nfstime3 nfsv3fa_mtime;
+ nfstime3 nfsv3fa_ctime;
+ } fa_nfsv3;
+ } fa_un;
+};
+
+/* and some ugly defines for accessing union components */
+#define fa2_size fa_un.fa_nfsv2.nfsv2fa_size
+#define fa2_blocksize fa_un.fa_nfsv2.nfsv2fa_blocksize
+#define fa2_rdev fa_un.fa_nfsv2.nfsv2fa_rdev
+#define fa2_blocks fa_un.fa_nfsv2.nfsv2fa_blocks
+#define fa2_fsid fa_un.fa_nfsv2.nfsv2fa_fsid
+#define fa2_fileid fa_un.fa_nfsv2.nfsv2fa_fileid
+#define fa2_atime fa_un.fa_nfsv2.nfsv2fa_atime
+#define fa2_mtime fa_un.fa_nfsv2.nfsv2fa_mtime
+#define fa2_ctime fa_un.fa_nfsv2.nfsv2fa_ctime
+#define fa3_size fa_un.fa_nfsv3.nfsv3fa_size
+#define fa3_used fa_un.fa_nfsv3.nfsv3fa_used
+#define fa3_rdev fa_un.fa_nfsv3.nfsv3fa_rdev
+#define fa3_fsid fa_un.fa_nfsv3.nfsv3fa_fsid
+#define fa3_fileid fa_un.fa_nfsv3.nfsv3fa_fileid
+#define fa3_atime fa_un.fa_nfsv3.nfsv3fa_atime
+#define fa3_mtime fa_un.fa_nfsv3.nfsv3fa_mtime
+#define fa3_ctime fa_un.fa_nfsv3.nfsv3fa_ctime
+
+struct nfsv2_sattr {
+ u_int32_t sa_mode;
+ u_int32_t sa_uid;
+ u_int32_t sa_gid;
+ u_int32_t sa_size;
+ nfstime2 sa_atime;
+ nfstime2 sa_mtime;
+};
+
+/*
+ * NFS Version 3 sattr structure for the new node creation case.
+ */
+struct nfsv3_sattr {
+ u_int32_t sa_modeset;
+ u_int32_t sa_mode;
+ u_int32_t sa_uidset;
+ u_int32_t sa_uid;
+ u_int32_t sa_gidset;
+ u_int32_t sa_gid;
+ u_int32_t sa_sizeset;
+ u_int32_t sa_size;
+ u_int32_t sa_atimetype;
+ nfstime3 sa_atime;
+ u_int32_t sa_mtimetype;
+ nfstime3 sa_mtime;
+};
+
+struct nfs_statfs {
+ union {
+ struct {
+ u_int32_t nfsv2sf_tsize;
+ u_int32_t nfsv2sf_bsize;
+ u_int32_t nfsv2sf_blocks;
+ u_int32_t nfsv2sf_bfree;
+ u_int32_t nfsv2sf_bavail;
+ } sf_nfsv2;
+ struct {
+ nfsuint64 nfsv3sf_tbytes;
+ nfsuint64 nfsv3sf_fbytes;
+ nfsuint64 nfsv3sf_abytes;
+ nfsuint64 nfsv3sf_tfiles;
+ nfsuint64 nfsv3sf_ffiles;
+ nfsuint64 nfsv3sf_afiles;
+ u_int32_t nfsv3sf_invarsec;
+ } sf_nfsv3;
+ } sf_un;
+};
+
+#define sf_tsize sf_un.sf_nfsv2.nfsv2sf_tsize
+#define sf_bsize sf_un.sf_nfsv2.nfsv2sf_bsize
+#define sf_blocks sf_un.sf_nfsv2.nfsv2sf_blocks
+#define sf_bfree sf_un.sf_nfsv2.nfsv2sf_bfree
+#define sf_bavail sf_un.sf_nfsv2.nfsv2sf_bavail
+#define sf_tbytes sf_un.sf_nfsv3.nfsv3sf_tbytes
+#define sf_fbytes sf_un.sf_nfsv3.nfsv3sf_fbytes
+#define sf_abytes sf_un.sf_nfsv3.nfsv3sf_abytes
+#define sf_tfiles sf_un.sf_nfsv3.nfsv3sf_tfiles
+#define sf_ffiles sf_un.sf_nfsv3.nfsv3sf_ffiles
+#define sf_afiles sf_un.sf_nfsv3.nfsv3sf_afiles
+#define sf_invarsec sf_un.sf_nfsv3.nfsv3sf_invarsec
+
+struct nfsv3_fsinfo {
+ u_int32_t fs_rtmax;
+ u_int32_t fs_rtpref;
+ u_int32_t fs_rtmult;
+ u_int32_t fs_wtmax;
+ u_int32_t fs_wtpref;
+ u_int32_t fs_wtmult;
+ u_int32_t fs_dtpref;
+ nfsuint64 fs_maxfilesize;
+ nfstime3 fs_timedelta;
+ u_int32_t fs_properties;
+};
+
+struct nfsv3_pathconf {
+ u_int32_t pc_linkmax;
+ u_int32_t pc_namemax;
+ u_int32_t pc_notrunc;
+ u_int32_t pc_chownrestricted;
+ u_int32_t pc_caseinsensitive;
+ u_int32_t pc_casepreserving;
+};
diff --git a/contrib/tcpdump/nfsfh.h b/contrib/tcpdump/nfsfh.h
index 383c784..c1ce79b 100644
--- a/contrib/tcpdump/nfsfh.h
+++ b/contrib/tcpdump/nfsfh.h
@@ -1,5 +1,5 @@
/*
- * $Header: nfsfh.h,v 1.5 96/08/20 14:33:23 leres Exp $
+ * $Header: nfsfh.h,v 1.4 95/10/19 20:27:44 leres Exp $
*
* nfsfh.h - NFS file handle definitions (for portable use)
*
@@ -24,11 +24,11 @@ typedef struct {
* our internal representation of that.
*/
typedef struct {
- my_devt Fsid_dev; /* XXX avoid name conflict with AIX */
+ my_devt fsid_dev;
u_int32_t fsid_code;
} my_fsid;
#define fsid_eq(a,b) ((a.fsid_code == b.fsid_code) &&\
dev_eq(a.fsid_dev, b.fsid_dev))
-extern void Parse_fh(caddr_t *, my_fsid *, ino_t *, char **, char **, int);
+extern void Parse_fh(caddr_t *, int, my_fsid *, ino_t *, char **, char **, int);
diff --git a/contrib/tcpdump/nfsv2.h b/contrib/tcpdump/nfsv2.h
deleted file mode 100644
index b2c0ff9..0000000
--- a/contrib/tcpdump/nfsv2.h
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * Copyright (c) 1994, 1995, 1996
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Rick Macklem at The University of Guelph.
- *
- * 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. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. 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.
- *
- * @(#)nfsv2.h 7.11 (Berkeley) 9/30/92
- */
-
-/*
- * nfs definitions as per the version 2 specs
- */
-
-/*
- * Constants as defined in the Sun NFS Version 2 spec.
- * "NFS: Network File System Protocol Specification" RFC1094
- */
-
-#define NFS_PORT 2049
-#define NFS_PROG 100003
-#define NFS_VER2 2
-#define NFS_MAXDGRAMDATA 8192
-#define NFS_MAXDATA 32768
-#define NFS_MAXPATHLEN 1024
-#define NFS_MAXNAMLEN 255
-#define NFS_FHSIZE 32
-#define NFS_MAXPKTHDR 404
-#define NFS_MAXPACKET (NFS_MAXPKTHDR+NFS_MAXDATA)
-#define NFS_MINPACKET 20
-#define NFS_FABLKSIZE 512 /* Size in bytes of a block wrt fa_blocks */
-
-/* Stat numbers for rpc returns */
-#define NFS_OK 0
-#define NFSERR_PERM 1
-#define NFSERR_NOENT 2
-#define NFSERR_IO 5
-#define NFSERR_NXIO 6
-#define NFSERR_ACCES 13
-#define NFSERR_EXIST 17
-#define NFSERR_NODEV 19
-#define NFSERR_NOTDIR 20
-#define NFSERR_ISDIR 21
-#define NFSERR_FBIG 27
-#define NFSERR_NOSPC 28
-#define NFSERR_ROFS 30
-#define NFSERR_NAMETOL 63
-#define NFSERR_NOTEMPTY 66
-#define NFSERR_DQUOT 69
-#define NFSERR_STALE 70
-#define NFSERR_WFLUSH 99
-
-/* Sizes in bytes of various nfs rpc components */
-#define NFSX_FH 32
-#define NFSX_UNSIGNED 4
-#define NFSX_NFSFATTR 68
-#define NFSX_NQFATTR 92
-#define NFSX_NFSSATTR 32
-#define NFSX_NQSATTR 44
-#define NFSX_COOKIE 4
-#define NFSX_NFSSTATFS 20
-#define NFSX_NQSTATFS 28
-#define NFSX_FATTR(isnq) ((isnq) ? NFSX_NQFATTR : NFSX_NFSFATTR)
-#define NFSX_SATTR(isnq) ((isnq) ? NFSX_NQSATTR : NFSX_NFSSATTR)
-#define NFSX_STATFS(isnq) ((isnq) ? NFSX_NQSTATFS : NFSX_NFSSTATFS)
-
-/* nfs rpc procedure numbers */
-#define NFSPROC_NULL 0
-#define NFSPROC_GETATTR 1
-#define NFSPROC_SETATTR 2
-#define NFSPROC_NOOP 3
-#define NFSPROC_ROOT NFSPROC_NOOP /* Obsolete */
-#define NFSPROC_LOOKUP 4
-#define NFSPROC_READLINK 5
-#define NFSPROC_READ 6
-#define NFSPROC_WRITECACHE NFSPROC_NOOP /* Obsolete */
-#define NFSPROC_WRITE 8
-#define NFSPROC_CREATE 9
-#define NFSPROC_REMOVE 10
-#define NFSPROC_RENAME 11
-#define NFSPROC_LINK 12
-#define NFSPROC_SYMLINK 13
-#define NFSPROC_MKDIR 14
-#define NFSPROC_RMDIR 15
-#define NFSPROC_READDIR 16
-#define NFSPROC_STATFS 17
-
-/* NQ nfs numbers */
-#define NQNFSPROC_READDIRLOOK 18
-#define NQNFSPROC_GETLEASE 19
-#define NQNFSPROC_VACATED 20
-#define NQNFSPROC_EVICTED 21
-#define NQNFSPROC_ACCESS 22
-
-#define NFS_NPROCS 23
-/* Conversion macros */
-extern int vttoif_tab[];
-#define vtonfs_mode(t,m) \
- txdr_unsigned(((t) == VFIFO) ? MAKEIMODE(VCHR, (m)) : \
- MAKEIMODE((t), (m)))
-#define nfstov_mode(a) (fxdr_unsigned(u_short, (a))&07777)
-#define vtonfs_type(a) txdr_unsigned(nfs_type[((int32_t)(a))])
-#define nfstov_type(a) ntov_type[fxdr_unsigned(u_int32_t,(a))&0x7]
-
-/* File types */
-typedef enum {
- NFNON=0, NFREG=1, NFDIR=2, NFBLK=3, NFCHR=4, NFLNK=5
-} tcpdump_nfstype;
-
-/* Structs for common parts of the rpc's */
-struct nfsv2_time {
- u_int32_t nfs_sec;
- u_int32_t nfs_usec;
-};
-
-struct nqnfs_time {
- u_int32_t nq_sec;
- u_int32_t nq_nsec;
-};
-
-/*
- * File attributes and setable attributes. These structures cover both
- * NFS version 2 and the NQNFS protocol. Note that the union is only
- * used to that one pointer can refer to both variants. These structures
- * go out on the wire and must be densely packed, so no quad data types
- * are used. (all fields are int32_t or u_int32_t's or structures of same)
- * NB: You can't do sizeof(struct nfsv2_fattr), you must use the
- * NFSX_FATTR(isnq) macro.
- */
-struct nfsv2_fattr {
- u_int32_t fa_type;
- u_int32_t fa_mode;
- u_int32_t fa_nlink;
- u_int32_t fa_uid;
- u_int32_t fa_gid;
- union {
- struct {
- u_int32_t nfsfa_size;
- u_int32_t nfsfa_blocksize;
- u_int32_t nfsfa_rdev;
- u_int32_t nfsfa_blocks;
- u_int32_t nfsfa_fsid;
- u_int32_t nfsfa_fileid;
- struct nfsv2_time nfsfa_atime;
- struct nfsv2_time nfsfa_mtime;
- struct nfsv2_time nfsfa_ctime;
- } fa_nfsv2;
- struct {
- struct {
- u_int32_t nqfa_qsize[2];
- } nqfa_size;
- u_int32_t nqfa_blocksize;
- u_int32_t nqfa_rdev;
- struct {
- u_int32_t nqfa_qbytes[2];
- } nqfa_bytes;
- u_int32_t nqfa_fsid;
- u_int32_t nqfa_fileid;
- struct nqnfs_time nqfa_atime;
- struct nqnfs_time nqfa_mtime;
- struct nqnfs_time nqfa_ctime;
- u_int32_t nqfa_flags;
- u_int32_t nqfa_gen;
- struct {
- u_int32_t nqfa_qfilerev[2];
- } nqfa_filerev;
- } fa_nqnfs;
- } fa_un;
-};
-
-/* and some ugly defines for accessing union components */
-#define fa_nfssize fa_un.fa_nfsv2.nfsfa_size
-#define fa_nfsblocksize fa_un.fa_nfsv2.nfsfa_blocksize
-#define fa_nfsrdev fa_un.fa_nfsv2.nfsfa_rdev
-#define fa_nfsblocks fa_un.fa_nfsv2.nfsfa_blocks
-#define fa_nfsfsid fa_un.fa_nfsv2.nfsfa_fsid
-#define fa_nfsfileid fa_un.fa_nfsv2.nfsfa_fileid
-#define fa_nfsatime fa_un.fa_nfsv2.nfsfa_atime
-#define fa_nfsmtime fa_un.fa_nfsv2.nfsfa_mtime
-#define fa_nfsctime fa_un.fa_nfsv2.nfsfa_ctime
-#define fa_nqsize fa_un.fa_nqnfs.nqfa_size
-#define fa_nqblocksize fa_un.fa_nqnfs.nqfa_blocksize
-#define fa_nqrdev fa_un.fa_nqnfs.nqfa_rdev
-#define fa_nqbytes fa_un.fa_nqnfs.nqfa_bytes
-#define fa_nqfsid fa_un.fa_nqnfs.nqfa_fsid
-#define fa_nqfileid fa_un.fa_nqnfs.nqfa_fileid
-#define fa_nqatime fa_un.fa_nqnfs.nqfa_atime
-#define fa_nqmtime fa_un.fa_nqnfs.nqfa_mtime
-#define fa_nqctime fa_un.fa_nqnfs.nqfa_ctime
-#define fa_nqflags fa_un.fa_nqnfs.nqfa_flags
-#define fa_nqgen fa_un.fa_nqnfs.nqfa_gen
-#define fa_nqfilerev fa_un.fa_nqnfs.nqfa_filerev
-
-struct nfsv2_sattr {
- u_int32_t sa_mode;
- u_int32_t sa_uid;
- u_int32_t sa_gid;
- union {
- struct {
- u_int32_t nfssa_size;
- struct nfsv2_time nfssa_atime;
- struct nfsv2_time nfssa_mtime;
- } sa_nfsv2;
- struct {
- struct {
- u_int32_t nqsa_qsize[2];
- } nqsa_size;
- struct nqnfs_time nqsa_atime;
- struct nqnfs_time nqsa_mtime;
- u_int32_t nqsa_flags;
- u_int32_t nqsa_rdev;
- } sa_nqnfs;
- } sa_un;
-};
-
-/* and some ugly defines for accessing the unions */
-#define sa_nfssize sa_un.sa_nfsv2.nfssa_size
-#define sa_nfsatime sa_un.sa_nfsv2.nfssa_atime
-#define sa_nfsmtime sa_un.sa_nfsv2.nfssa_mtime
-#define sa_nqsize sa_un.sa_nqnfs.nqsa_size
-#define sa_nqatime sa_un.sa_nqnfs.nqsa_atime
-#define sa_nqmtime sa_un.sa_nqnfs.nqsa_mtime
-#define sa_nqflags sa_un.sa_nqnfs.nqsa_flags
-#define sa_nqrdev sa_un.sa_nqnfs.nqsa_rdev
-
-struct nfsv2_statfs {
- u_int32_t sf_tsize;
- u_int32_t sf_bsize;
- u_int32_t sf_blocks;
- u_int32_t sf_bfree;
- u_int32_t sf_bavail;
- u_int32_t sf_files; /* Nqnfs only */
- u_int32_t sf_ffree; /* ditto */
-};
diff --git a/contrib/tcpdump/parsenfsfh.c b/contrib/tcpdump/parsenfsfh.c
index 9746672..cc79aae 100644
--- a/contrib/tcpdump/parsenfsfh.c
+++ b/contrib/tcpdump/parsenfsfh.c
@@ -1,3 +1,7 @@
+#ifndef lint
+static char *RCSid = "$Header: parsenfsfh.c,v 1.9 95/10/19 20:27:44 leres Exp $";
+#endif
+
/*
* parsenfsfh.c - portable parser for NFS file handles
* uses all sorts of heuristics
@@ -7,11 +11,6 @@
* Western Research Laboratory
*/
-#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: parsenfsfh.c,v 1.12 96/12/10 23:25:50 leres Exp $ (LBL)";
-#endif
-
#include <sys/types.h>
#include <sys/time.h>
@@ -75,8 +74,9 @@ static const char rcsid[] =
static int is_UCX(unsigned char *);
void
-Parse_fh(fh, fsidp, inop, osnamep, fsnamep, ourself)
+Parse_fh(fh, len, fsidp, inop, osnamep, fsnamep, ourself)
register caddr_t *fh;
+int len;
my_fsid *fsidp;
ino_t *inop;
char **osnamep; /* if non-NULL, return OS name here */
@@ -216,8 +216,8 @@ int ourself; /* true if file handle was generated on this host */
switch (fhtype) {
case FHT_AUSPEX:
- fsidp->Fsid_dev.Minor = fhp[7];
- fsidp->Fsid_dev.Major = fhp[6];
+ fsidp->fsid_dev.Minor = fhp[7];
+ fsidp->fsid_dev.Major = fhp[6];
fsidp->fsid_code = 0;
temp = make_uint32(fhp[12], fhp[13], fhp[14], fhp[15]);
@@ -232,8 +232,8 @@ int ourself; /* true if file handle was generated on this host */
/* XXX could ignore 3 high-order bytes */
temp = make_uint32(fhp[3], fhp[2], fhp[1], fhp[0]);
- fsidp->Fsid_dev.Minor = temp & 0xFFFFF;
- fsidp->Fsid_dev.Major = (temp>>20) & 0xFFF;
+ fsidp->fsid_dev.Minor = temp & 0xFFFFF;
+ fsidp->fsid_dev.Major = (temp>>20) & 0xFFF;
temp = make_uint32(fhp[15], fhp[14], fhp[13], fhp[12]);
*inop = temp;
@@ -242,8 +242,8 @@ int ourself; /* true if file handle was generated on this host */
break;
case FHT_IRIX4:
- fsidp->Fsid_dev.Minor = fhp[3];
- fsidp->Fsid_dev.Major = fhp[2];
+ fsidp->fsid_dev.Minor = fhp[3];
+ fsidp->fsid_dev.Major = fhp[2];
fsidp->fsid_code = 0;
temp = make_uint32(fhp[8], fhp[9], fhp[10], fhp[11]);
@@ -254,8 +254,8 @@ int ourself; /* true if file handle was generated on this host */
break;
case FHT_IRIX5:
- fsidp->Fsid_dev.Minor = make_uint16(fhp[2], fhp[3]);
- fsidp->Fsid_dev.Major = make_uint16(fhp[0], fhp[1]);
+ fsidp->fsid_dev.Minor = make_uint16(fhp[2], fhp[3]);
+ fsidp->fsid_dev.Major = make_uint16(fhp[0], fhp[1]);
fsidp->fsid_code = make_uint32(fhp[4], fhp[5], fhp[6], fhp[7]);
temp = make_uint32(fhp[12], fhp[13], fhp[14], fhp[15]);
@@ -271,8 +271,8 @@ int ourself; /* true if file handle was generated on this host */
break;
case FHT_SUNOS4:
- fsidp->Fsid_dev.Minor = fhp[3];
- fsidp->Fsid_dev.Major = fhp[2];
+ fsidp->fsid_dev.Minor = fhp[3];
+ fsidp->fsid_dev.Major = fhp[2];
fsidp->fsid_code = make_uint32(fhp[4], fhp[5], fhp[6], fhp[7]);
temp = make_uint32(fhp[12], fhp[13], fhp[14], fhp[15]);
@@ -284,9 +284,9 @@ int ourself; /* true if file handle was generated on this host */
case FHT_SUNOS5:
temp = make_uint16(fhp[0], fhp[1]);
- fsidp->Fsid_dev.Major = (temp>>2) & 0x3FFF;
+ fsidp->fsid_dev.Major = (temp>>2) & 0x3FFF;
temp = make_uint24(fhp[1], fhp[2], fhp[3]);
- fsidp->Fsid_dev.Minor = temp & 0x3FFFF;
+ fsidp->fsid_dev.Minor = temp & 0x3FFFF;
fsidp->fsid_code = make_uint32(fhp[4], fhp[5], fhp[6], fhp[7]);
temp = make_uint32(fhp[12], fhp[13], fhp[14], fhp[15]);
@@ -298,8 +298,8 @@ int ourself; /* true if file handle was generated on this host */
case FHT_ULTRIX:
fsidp->fsid_code = 0;
- fsidp->Fsid_dev.Minor = fhp[0];
- fsidp->Fsid_dev.Major = fhp[1];
+ fsidp->fsid_dev.Minor = fhp[0];
+ fsidp->fsid_dev.Major = fhp[1];
temp = make_uint32(fhp[7], fhp[6], fhp[5], fhp[4]);
*inop = temp;
@@ -319,8 +319,8 @@ int ourself; /* true if file handle was generated on this host */
memset((char *)tempa, 0, sizeof(tempa));
memcpy((char *)tempa, fh, 14); /* ensure alignment */
- fsidp->Fsid_dev.Minor = tempa[0] + (tempa[1]<<1);
- fsidp->Fsid_dev.Major = tempa[2] + (tempa[3]<<1);
+ fsidp->fsid_dev.Minor = tempa[0] + (tempa[1]<<1);
+ fsidp->fsid_dev.Major = tempa[2] + (tempa[3]<<1);
fsidp->fsid_code = 0;
}
@@ -336,8 +336,8 @@ int ourself; /* true if file handle was generated on this host */
break;
case FHT_AIX32:
- fsidp->Fsid_dev.Minor = make_uint16(fhp[2], fhp[3]);
- fsidp->Fsid_dev.Major = make_uint16(fhp[0], fhp[1]);
+ fsidp->fsid_dev.Minor = make_uint16(fhp[2], fhp[3]);
+ fsidp->fsid_dev.Major = make_uint16(fhp[0], fhp[1]);
fsidp->fsid_code = make_uint32(fhp[4], fhp[5], fhp[6], fhp[7]);
temp = make_uint32(fhp[12], fhp[13], fhp[14], fhp[15]);
@@ -348,9 +348,9 @@ int ourself; /* true if file handle was generated on this host */
break;
case FHT_HPUX9:
- fsidp->Fsid_dev.Major = fhp[0];
+ fsidp->fsid_dev.Major = fhp[0];
temp = make_uint24(fhp[1], fhp[2], fhp[3]);
- fsidp->Fsid_dev.Minor = temp;
+ fsidp->fsid_dev.Minor = temp;
fsidp->fsid_code = make_uint32(fhp[4], fhp[5], fhp[6], fhp[7]);
temp = make_uint32(fhp[12], fhp[13], fhp[14], fhp[15]);
@@ -372,8 +372,8 @@ int ourself; /* true if file handle was generated on this host */
#endif
/* XXX for now, give "bogus" values to aid debugging */
fsidp->fsid_code = 0;
- fsidp->Fsid_dev.Minor = 257;
- fsidp->Fsid_dev.Major = 257;
+ fsidp->fsid_dev.Minor = 257;
+ fsidp->fsid_dev.Major = 257;
*inop = 1;
/* display will show this string instead of (257,257) */
diff --git a/contrib/tcpdump/print-arp.c b/contrib/tcpdump/print-arp.c
index 19f9a9c..e58aeab 100644
--- a/contrib/tcpdump/print-arp.c
+++ b/contrib/tcpdump/print-arp.c
@@ -20,8 +20,8 @@
*/
#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: print-arp.c,v 1.41 96/10/27 14:54:50 leres Exp $ (LBL)";
+static char rcsid[] =
+ "@(#) $Header: print-arp.c,v 1.39 96/07/17 14:56:17 leres Exp $ (LBL)";
#endif
#include <sys/param.h>
@@ -33,6 +33,7 @@ struct mbuf;
struct rtentry;
#endif
#include <net/if.h>
+#include <net/if_var.h>
#include <netinet/in.h>
#include <netinet/if_ether.h>
@@ -126,5 +127,5 @@ arp_print(register const u_char *bp, u_int length, u_int caplen)
return;
}
if (hrd != ARPHRD_ETHER)
- printf(" hardware #%d", hrd);
+ printf(" hardware #%d", ap->arp_hrd);
}
diff --git a/contrib/tcpdump/print-atalk.c b/contrib/tcpdump/print-atalk.c
index 3b6f1cd..e81afb1 100644
--- a/contrib/tcpdump/print-atalk.c
+++ b/contrib/tcpdump/print-atalk.c
@@ -20,10 +20,9 @@
*
* Format and print AppleTalk packets.
*/
-
#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: print-atalk.c,v 1.45 96/12/10 23:24:07 leres Exp $ (LBL)";
+static char rcsid[] =
+ "@(#)$Header: print-atalk.c,v 1.43 96/07/23 14:16:55 leres Exp $ (LBL)";
#endif
#include <sys/param.h>
@@ -40,7 +39,7 @@ struct rtentry;
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/ip_var.h>
-#include <netinet/if_ether.h>
+#include <net/ethernet.h>
#include <netinet/udp.h>
#include <netinet/udp_var.h>
#include <netinet/tcp.h>
@@ -102,9 +101,16 @@ atalk_print(register const u_char *bp, u_int length)
register const struct atShortDDP *sdp;
u_short snet;
+#if 0
lp = (struct LAP *)bp;
bp += sizeof(*lp);
length -= sizeof(*lp);
+#else
+ {
+ static struct LAP lp_ = {0, 0, lapDDP};
+ lp = &lp_;
+ }
+#endif
switch (lp->type) {
case lapShortDDP:
@@ -162,9 +168,9 @@ aarp_print(register const u_char *bp, u_int length)
printf("aarp ");
ap = (const struct aarp *)bp;
- if (ap->htype == 1 && ap->ptype == ETHERTYPE_ATALK &&
+ if (ntohs(ap->htype) == 1 && ntohs(ap->ptype) == ETHERTYPE_ATALK &&
ap->halen == 6 && ap->palen == 4 )
- switch (ap->op) {
+ switch (ntohs(ap->op)) {
case 1: /* request */
(void)printf("who-has %s tell %s",
@@ -173,7 +179,7 @@ aarp_print(register const u_char *bp, u_int length)
case 2: /* response */
(void)printf("reply %s is-at %s",
- AT(pdaddr), etheraddr_string(ap->hdaddr));
+ AT(psaddr), etheraddr_string(ap->hsaddr));
return;
case 3: /* probe (oy!) */
@@ -498,26 +504,24 @@ ataddr_string(u_short atnet, u_char athost)
if (first && (first = 0, !nflag)
&& (fp = fopen("/etc/atalk.names", "r"))) {
char line[256];
- int i1, i2, i3;
+ int i1, i2;
while (fgets(line, sizeof(line), fp)) {
if (line[0] == '\n' || line[0] == 0 || line[0] == '#')
continue;
- if (sscanf(line, "%d.%d.%d %s", &i1, &i2, &i3,
- nambuf) == 4)
+ if (sscanf(line, "%d.%d %s", &i1, &i2, nambuf) == 3)
/* got a hostname. */
- i3 |= ((i1 << 8) | i2) << 8;
- else if (sscanf(line, "%d.%d %s", &i1, &i2,
- nambuf) == 3)
+ i2 |= (i1 << 8);
+ else if (sscanf(line, "%d %s", &i1, nambuf) == 2)
/* got a net name */
- i3 = (((i1 << 8) | i2) << 8) | 255;
+ i2 = (i1 << 8) | 255;
else
continue;
- for (tp = &hnametable[i3 & (HASHNAMESIZE-1)];
+ for (tp = &hnametable[i2 & (HASHNAMESIZE-1)];
tp->nxt; tp = tp->nxt)
;
- tp->addr = i3;
+ tp->addr = i2;
tp->nxt = newhnamemem();
tp->name = savestr(nambuf);
}
@@ -542,10 +546,9 @@ ataddr_string(u_short atnet, u_char athost)
tp->addr = (atnet << 8) | athost;
tp->nxt = newhnamemem();
if (athost != 255)
- (void)sprintf(nambuf, "%d.%d.%d",
- atnet >> 8, atnet & 0xff, athost);
+ (void)sprintf(nambuf, "%d.%d", atnet, athost);
else
- (void)sprintf(nambuf, "%d.%d", atnet >> 8, atnet & 0xff);
+ (void)sprintf(nambuf, "%d", atnet);
tp->name = savestr(nambuf);
return (tp->name);
diff --git a/contrib/tcpdump/print-atm.c b/contrib/tcpdump/print-atm.c
index 13c989d..e07fa2a 100644
--- a/contrib/tcpdump/print-atm.c
+++ b/contrib/tcpdump/print-atm.c
@@ -19,8 +19,8 @@
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: print-atm.c,v 1.8 96/09/26 23:36:41 leres Exp $ (LBL)";
+static char rcsid[] =
+ "@(#) $Header: print-atm.c,v 1.7 96/07/23 14:17:21 leres Exp $ (LBL)";
#endif
#include <sys/param.h>
@@ -34,7 +34,7 @@ struct rtentry;
#include <net/if.h>
#include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <net/ethernet.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/ip_var.h>
diff --git a/contrib/tcpdump/print-bootp.c b/contrib/tcpdump/print-bootp.c
index 8dc598e..4402e49 100644
--- a/contrib/tcpdump/print-bootp.c
+++ b/contrib/tcpdump/print-bootp.c
@@ -21,8 +21,8 @@
* Format and print bootp packets.
*/
#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: print-bootp.c,v 1.43 96/09/26 23:36:42 leres Exp $ (LBL)";
+static char rcsid[] =
+ "@(#) $Header: print-bootp.c,v 1.42 96/07/23 14:17:22 leres Exp $ (LBL)";
#endif
#include <sys/param.h>
@@ -36,7 +36,7 @@ struct rtentry;
#include <net/if.h>
#include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <net/ethernet.h>
#include <ctype.h>
#include <stdio.h>
diff --git a/contrib/tcpdump/print-domain.c b/contrib/tcpdump/print-domain.c
index 18b77f4..e6651e7 100644
--- a/contrib/tcpdump/print-domain.c
+++ b/contrib/tcpdump/print-domain.c
@@ -20,8 +20,8 @@
*/
#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: print-domain.c,v 1.37 96/12/10 23:21:06 leres Exp $ (LBL)";
+static char rcsid[] =
+ "@(#) $Header: print-domain.c,v 1.35 96/07/23 14:17:22 leres Exp $ (LBL)";
#endif
#include <sys/param.h>
@@ -35,7 +35,7 @@ struct rtentry;
#include <net/if.h>
#include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <net/ethernet.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/ip_var.h>
@@ -323,7 +323,7 @@ ns_rprint(register const u_char *cp, register const u_char *bp)
printf(" %.*s", len, cp);
break;
}
- return (rp); /* XXX This isn't always right */
+ return (rp); /* XXX This isn't always right*/
}
void
diff --git a/contrib/tcpdump/print-ether.c b/contrib/tcpdump/print-ether.c
index f692efb..bab0059 100644
--- a/contrib/tcpdump/print-ether.c
+++ b/contrib/tcpdump/print-ether.c
@@ -19,8 +19,8 @@
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: print-ether.c,v 1.43 96/09/26 23:36:43 leres Exp $ (LBL)";
+static char rcsid[] =
+ "@(#) $Header: print-ether.c,v 1.42 96/07/23 14:17:23 leres Exp $ (LBL)";
#endif
#include <sys/param.h>
@@ -34,7 +34,7 @@ struct rtentry;
#include <net/if.h>
#include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <net/ethernet.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/ip_var.h>
@@ -116,7 +116,7 @@ ether_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
* Is it (gag) an 802.3 encapsulation?
*/
extracted_ethertype = 0;
- if (ether_type < ETHERMTU) {
+ if (ether_type <= ETHERMTU) {
/* Try to print the LLC-layer header & higher layers */
if (llc_print(p, length, caplen, ESRC(ep), EDST(ep)) == 0) {
/* ether_type not known, print raw packet */
@@ -185,6 +185,10 @@ ether_encap_print(u_short ethertype, const u_char *p,
aarp_print(p, length);
return (1);
+ case ETHERTYPE_IPX:
+ ipx_print(p, length);
+ return (1);
+
case ETHERTYPE_LAT:
case ETHERTYPE_SCA:
case ETHERTYPE_MOPRC:
diff --git a/contrib/tcpdump/print-fddi.c b/contrib/tcpdump/print-fddi.c
index 29a5531..c577562 100644
--- a/contrib/tcpdump/print-fddi.c
+++ b/contrib/tcpdump/print-fddi.c
@@ -20,8 +20,8 @@
*/
#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: print-fddi.c,v 1.33 96/12/10 23:20:49 leres Exp $ (LBL)";
+static char rcsid[] =
+ "@(#)$Header: print-fddi.c,v 1.31 96/07/14 19:38:59 leres Exp $ (LBL)";
#endif
#ifdef HAVE_FDDI
@@ -38,7 +38,7 @@ struct rtentry;
#include <net/if.h>
#include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <net/ethernet.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
@@ -279,7 +279,7 @@ fddi_if_print(u_char *pcap, const struct pcap_pkthdr *h,
/*
* Get the FDDI addresses into a canonical form
*/
- extract_fddi_addrs(fddip, (char *)ESRC(&ehdr), (char *)EDST(&ehdr));
+ extract_fddi_addrs(fddip, (char*)ESRC(&ehdr), (char*)EDST(&ehdr));
/*
* Some printers want to get back at the link level addresses,
* and/or check that they're not walking off the end of the packet.
diff --git a/contrib/tcpdump/print-icmp.c b/contrib/tcpdump/print-icmp.c
index c72988d..a94dd13 100644
--- a/contrib/tcpdump/print-icmp.c
+++ b/contrib/tcpdump/print-icmp.c
@@ -20,8 +20,8 @@
*/
#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: print-icmp.c,v 1.38 96/09/26 23:36:44 leres Exp $ (LBL)";
+static char rcsid[] =
+ "@(#) $Header: print-icmp.c,v 1.36 96/07/23 14:17:24 leres Exp $ (LBL)";
#endif
#include <sys/param.h>
@@ -35,7 +35,7 @@ struct rtentry;
#include <net/if.h>
#include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <net/ethernet.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
@@ -273,7 +273,7 @@ icmp_print(register const u_char *bp, register const u_char *bp2)
ihp = (struct ih_rdiscovery *)&dp->icmp_void;
TCHECK(*ihp);
- (void)strcpy(cp, " lifetime ");
+ (void)strcpy(cp, "lifetime ");
cp = buf + strlen(buf);
lifetime = EXTRACT_16BITS(&ihp->ird_lifetime);
if (lifetime < 60)
diff --git a/contrib/tcpdump/print-ip.c b/contrib/tcpdump/print-ip.c
index 363fd61..2f49352 100644
--- a/contrib/tcpdump/print-ip.c
+++ b/contrib/tcpdump/print-ip.c
@@ -20,8 +20,8 @@
*/
#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: print-ip.c,v 1.62 96/12/10 23:20:31 leres Exp $ (LBL)";
+static char rcsid[] =
+ "@(#) $Header: print-ip.c,v 1.56 96/07/23 14:17:24 leres Exp $ (LBL)";
#endif
#include <sys/param.h>
@@ -64,17 +64,17 @@ struct tr_query {
u_int tr_src; /* traceroute source */
u_int tr_dst; /* traceroute destination */
u_int tr_raddr; /* traceroute response address */
-#ifdef WORDS_BIGENDIAN
+#if defined(BYTE_ORDER) && (BYTE_ORDER == LITTLE_ENDIAN)
struct {
- u_int ttl : 8; /* traceroute response ttl */
- u_int qid : 24; /* traceroute query id */
+ u_int qid : 24; /* traceroute query id */
+ u_int ttl : 8; /* traceroute response ttl */
} q;
#else
struct {
- u_int qid : 24; /* traceroute query id */
- u_int ttl : 8; /* traceroute response ttl */
+ u_int ttl : 8; /* traceroute response ttl */
+ u_int qid : 24; /* traceroute query id */
} q;
-#endif
+#endif /* BYTE_ORDER */
};
#define tr_rttl q.ttl
@@ -121,7 +121,7 @@ struct tr_resp {
static void print_mtrace(register const u_char *bp, register u_int len)
{
- register struct tr_query *tr = (struct tr_query *)(bp + 8);
+ register struct tr_query* tr = (struct tr_query*)(bp + 8);
printf("mtrace %d: %s to %s reply-to %s", tr->tr_qid,
ipaddr_string(&tr->tr_src), ipaddr_string(&tr->tr_dst),
@@ -132,7 +132,7 @@ static void print_mtrace(register const u_char *bp, register u_int len)
static void print_mresp(register const u_char *bp, register u_int len)
{
- register struct tr_query *tr = (struct tr_query *)(bp + 8);
+ register struct tr_query* tr = (struct tr_query*)(bp + 8);
printf("mresp %d: %s to %s reply-to %s", tr->tr_qid,
ipaddr_string(&tr->tr_src), ipaddr_string(&tr->tr_dst),
@@ -155,22 +155,30 @@ igmp_print(register const u_char *bp, register u_int len,
TCHECK2(bp[0], 8);
switch (bp[0]) {
case 0x11:
- (void)printf("igmp query");
+ (void)printf("igmp %s query", bp[1] ? "v2" : "v1");
+ if (bp[1] && bp[1] != 100)
+ (void)printf(" [intvl %d]", bp[1]);
if (*(int *)&bp[4])
(void)printf(" [gaddr %s]", ipaddr_string(&bp[4]));
if (len != 8)
(void)printf(" [len %d]", len);
break;
case 0x12:
- (void)printf("igmp report %s", ipaddr_string(&bp[4]));
+ case 0x16:
+ (void)printf("igmp %s report %s",
+ (bp[0] & 0x0f) == 6 ? "v2" : "v1",
+ ipaddr_string(&bp[4]));
if (len != 8)
(void)printf(" [len %d]", len);
- break;
- case 0x16:
- (void)printf("igmp nreport %s", ipaddr_string(&bp[4]));
+ if (bp[1])
+ (void)printf(" [b1=0x%x]", bp[1]);
break;
case 0x17:
(void)printf("igmp leave %s", ipaddr_string(&bp[4]));
+ if (len != 8)
+ (void)printf(" [len %d]", len);
+ if (bp[1])
+ (void)printf(" [b1=0x%x]", bp[1]);
break;
case 0x13:
(void)printf("igmp dvmrp");
@@ -191,22 +199,22 @@ igmp_print(register const u_char *bp, register u_int len,
break;
default:
(void)printf("igmp-%d", bp[0] & 0xf);
+ if (bp[1])
+ (void)printf(" [b1=0x%02x]", bp[1]);
break;
}
- if ((bp[0] >> 4) != 1)
- (void)printf(" [v%d]", bp[0] >> 4);
TCHECK2(bp[0], len);
if (vflag) {
/* Check the IGMP checksum */
u_int32_t sum = 0;
int count;
- const u_short *sp = (u_short *)bp;
+ const u_short *sp = (u_short*)bp;
for (count = len / 2; --count >= 0; )
sum += *sp++;
if (len & 1)
- sum += ntohs(*(u_char *) sp << 8);
+ sum += ntohs(*(unsigned char*) sp << 8);
while (sum >> 16)
sum = (sum & 0xffff) + (sum >> 16);
sum = 0xffff & ~sum;
@@ -296,6 +304,12 @@ ip_optprint(register const u_char *cp, u_int length)
ip_printroute("LSRR", cp, len);
break;
+ case IPOPT_RA:
+ printf(" RA{%d}", len);
+ if (cp[2] != 0 || cp[3] != 0)
+ printf(" [b23=0x04%x]", cp[2] << 8 | cp[3]);
+ break;
+
default:
printf(" IPOPT-%d{%d}", cp[0], len);
break;
@@ -431,10 +445,10 @@ ip_print(register const u_char *bp, register u_int length)
igmp_print(cp, len, (const u_char *)ip);
break;
-#ifndef IPPROTO_ENCAP
-#define IPPROTO_ENCAP 4
+#ifndef IPPROTO_IPIP
+#define IPPROTO_IPIP 4
#endif
- case IPPROTO_ENCAP:
+ case IPPROTO_IPIP:
/* ip-in-ip encapsulation */
if (vflag)
(void)printf("%s > %s: ",
@@ -447,22 +461,6 @@ ip_print(register const u_char *bp, register u_int length)
}
break;
-#ifndef IPPROTO_GRE
-#define IPPROTO_GRE 47
-#endif
- case IPPROTO_GRE:
- if (vflag)
- (void)printf("gre %s > %s: ",
- ipaddr_string(&ip->ip_src),
- ipaddr_string(&ip->ip_dst));
- /* do it */
- gre_print(cp, len);
- if (! vflag) {
- printf(" (gre encap)");
- return;
- }
- break;
-
default:
(void)printf("%s > %s:", ipaddr_string(&ip->ip_src),
ipaddr_string(&ip->ip_dst));
diff --git a/contrib/tcpdump/print-ipx.c b/contrib/tcpdump/print-ipx.c
index ccd6b53..8125e41 100644
--- a/contrib/tcpdump/print-ipx.c
+++ b/contrib/tcpdump/print-ipx.c
@@ -17,14 +17,15 @@
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
+ */
+
+/*
* Format and print Novell IPX packets.
* Contributed by Brad Parker (brad@fcr.com).
*/
-
#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: print-ipx.c,v 1.19 96/12/10 23:23:52 leres Exp $";
+static char rcsid[] =
+ "@(#)$Header: print-ipx.c,v 1.16 96/07/23 14:17:24 leres Exp $";
#endif
#include <sys/param.h>
@@ -144,7 +145,7 @@ ipx_sap_print(const u_short *ipx, u_int length)
if (length > 0) {
TCHECK(ipx[1]);
(void)printf(" %x '", EXTRACT_16BITS(&ipx[0]));
- fn_print((u_char *)&ipx[1], (u_char *)&ipx[1] + 48);
+ fn_print((char *)&ipx[1], (char *)&ipx[1] + 48);
putchar('\'');
}
break;
@@ -159,7 +160,7 @@ ipx_sap_print(const u_short *ipx, u_int length)
for (i = 0; i < 8 && length > 0; i++) {
TCHECK2(ipx[27], 1);
(void)printf(" %x '", EXTRACT_16BITS(&ipx[0]));
- fn_print((u_char *)&ipx[1], (u_char *)&ipx[1] + 48);
+ fn_print((char *)&ipx[1], (char *)&ipx[1] + 48);
printf("' addr %s",
ipxaddr_string(EXTRACT_32BITS(&ipx[25]), (u_char *)&ipx[27]));
ipx += 32;
@@ -190,7 +191,7 @@ ipx_rip_print(const u_short *ipx, u_int length)
(void)printf("ipx-rip-req");
if (length > 0) {
TCHECK(ipx[3]);
- (void)printf(" %u/%d.%d", EXTRACT_32BITS(&ipx[0]),
+ (void)printf(" %x/%d.%d", EXTRACT_32BITS(&ipx[0]),
EXTRACT_16BITS(&ipx[2]), EXTRACT_16BITS(&ipx[3]));
}
break;
@@ -198,7 +199,7 @@ ipx_rip_print(const u_short *ipx, u_int length)
(void)printf("ipx-rip-resp");
for (i = 0; i < 50 && length > 0; i++) {
TCHECK(ipx[3]);
- (void)printf(" %u/%d.%d", EXTRACT_32BITS(&ipx[0]),
+ (void)printf(" %x/%d.%d", EXTRACT_32BITS(&ipx[0]),
EXTRACT_16BITS(&ipx[2]), EXTRACT_16BITS(&ipx[3]));
ipx += 4;
diff --git a/contrib/tcpdump/print-isoclns.c b/contrib/tcpdump/print-isoclns.c
index 90b88c8..d5e1496 100644
--- a/contrib/tcpdump/print-isoclns.c
+++ b/contrib/tcpdump/print-isoclns.c
@@ -17,13 +17,15 @@
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
+ */
+
+/*
* Original code by Matt Thomas, Digital Equipment Corporation
*/
#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: print-isoclns.c,v 1.14 96/12/10 23:26:56 leres Exp $ (LBL)";
+static char rcsid[] =
+ "@(#) $Header: print-isoclns.c,v 1.12 96/07/14 19:39:00 leres Exp $ (LBL)";
#endif
#include <sys/types.h>
@@ -37,21 +39,23 @@ struct rtentry;
#include <net/if.h>
#include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <net/ethernet.h>
#include <stdio.h>
#include "interface.h"
#include "addrtoname.h"
#include "ethertype.h"
+#include "extract.h"
-#define CLNS 129
-#define ESIS 130
-#define ISIS 131
-#define NULLNS 0
+#define NLPID_CLNS 129 /* 0x81 */
+#define NLPID_ESIS 130 /* 0x82 */
+#define NLPID_ISIS 131 /* 0x83 */
+#define NLPID_NULLNS 0
-static int osi_cksum(const u_char *, u_int, const u_char *, u_char *, u_char *);
+static int osi_cksum(const u_char *, int, u_char *);
static void esis_print(const u_char *, u_int);
+static int isis_print(const u_char *, u_int);
void
isoclns_print(const u_char *p, u_int length, u_int caplen,
@@ -68,17 +72,16 @@ isoclns_print(const u_char *p, u_int length, u_int caplen,
switch (*p) {
- case CLNS:
- /* esis_print(&p, &length); */
- printf("iso-clns");
+ case NLPID_CLNS:
+ printf("iso clns");
if (!eflag)
(void)printf(" %s > %s",
etheraddr_string(esrc),
etheraddr_string(edst));
break;
- case ESIS:
- printf("iso-esis");
+ case NLPID_ESIS:
+ printf("iso esis");
if (!eflag)
(void)printf(" %s > %s",
etheraddr_string(esrc),
@@ -86,20 +89,19 @@ isoclns_print(const u_char *p, u_int length, u_int caplen,
esis_print(p, length);
return;
- case ISIS:
- printf("iso-isis");
+ case NLPID_ISIS:
+ printf("iso isis");
if (!eflag)
(void)printf(" %s > %s",
etheraddr_string(esrc),
etheraddr_string(edst));
- /* isis_print(&p, &length); */
(void)printf(" len=%d ", length);
- if (caplen > 1)
- default_print_unaligned(p, caplen);
+ if (!isis_print(p, length))
+ default_print_unaligned(p, caplen);
break;
- case NULLNS:
- printf("iso-nullns");
+ case NLPID_NULLNS:
+ printf("iso nullns");
if (!eflag)
(void)printf(" %s > %s",
etheraddr_string(esrc),
@@ -107,7 +109,7 @@ isoclns_print(const u_char *p, u_int length, u_int caplen,
break;
default:
- printf("iso-clns %02x", p[0]);
+ printf("iso clns %02x", p[0]);
if (!eflag)
(void)printf(" %s > %s",
etheraddr_string(esrc),
@@ -185,9 +187,10 @@ esis_print(const u_char *p, u_int length)
}
off[0] = eh->cksum[0];
off[1] = eh->cksum[1];
- if (vflag && osi_cksum(p, li, eh->cksum, cksum, off)) {
- printf(" bad cksum (got %02x%02x want %02x%02x)",
- eh->cksum[1], eh->cksum[0], cksum[1], cksum[0]);
+ if (vflag && osi_cksum(p, li, off)) {
+ printf(" bad cksum (got %02x%02x)",
+ eh->cksum[1], eh->cksum[0]);
+ default_print(p, length);
return;
}
if (eh->version != 1) {
@@ -204,7 +207,7 @@ esis_print(const u_char *p, u_int length)
dst = p; p += *p + 1;
if (p > snapend)
return;
- printf(" %s", isonsap_string(dst));
+ printf("\n\t\t\t %s", isonsap_string(dst));
snpa = p; p += *p + 1;
is = p; p += *p + 1;
if (p > snapend)
@@ -235,7 +238,8 @@ esis_print(const u_char *p, u_int length)
}
if (p > snapend)
return;
- printf(" %s", isonsap_string(is));
+ if (!qflag)
+ printf("\n\t\t\t %s", isonsap_string(is));
li = ep - p;
break;
}
@@ -282,36 +286,274 @@ esis_print(const u_char *p, u_int length)
}
}
+/*
+ * print_nsap
+ * Print out an NSAP.
+ */
+
+void
+print_nsap (register const u_char *cp, register int length)
+{
+ int i;
+
+ for (i = 0; i < length; i++) {
+ printf("%02x", *cp++);
+ if (((i & 1) == 0) && (i + 1 < length)) {
+ printf(".");
+ }
+
+ }
+}
+
+/*
+ * IS-IS is defined in ISO 10589. Look there for protocol definitions.
+ */
+
+#define SYSTEM_ID_LEN sizeof(struct ether_addr)
+#define ISIS_VERSION 1
+#define PDU_TYPE_MASK 0x1F
+#define PRIORITY_MASK 0x7F
+
+#define L1_LAN_IIH 15
+#define L2_LAN_IIH 16
+#define PTP_IIH 17
+
+#define TLV_AREA_ADDR 1
+#define TLV_ISNEIGH 6
+#define TLV_PADDING 8
+#define TLV_AUTHENT 10
+
+struct isis_header {
+ u_char nlpid;
+ u_char fixed_len;
+ u_char version; /* Protocol version? */
+ u_char id_length;
+ u_char enc_pdu_type; /* 3 MSbs are reserved */
+ u_char pkt_version; /* Packet format version? */
+ u_char reserved;
+ u_char enc_max_area;
+ u_char circuit;
+ u_char enc_source_id[SYSTEM_ID_LEN];
+ u_char enc_holding_time[2];
+ u_char enc_packet_len[2];
+ u_char enc_priority;
+ u_char enc_lan_id[SYSTEM_ID_LEN+1];
+};
+
+#define ISIS_HEADER_SIZE (15+(SYSTEM_ID_LEN<<1))
+
+/*
+ * isis_print
+ * Decode IS-IS packets. Return 0 on error.
+ *
+ * So far, this is only smart enough to print IIH's. Someday...
+ */
+
static int
-osi_cksum(register const u_char *p, register u_int len,
- const u_char *toff, u_char *cksum, u_char *off)
+isis_print (const u_char *p, u_int length)
+{
+ struct isis_header *header;
+ u_char pdu_type, max_area, priority, *pptr, type, len, *tptr, tmp, alen;
+ u_short packet_len, holding_time;
+
+ header = (struct isis_header *)p;
+ printf("\n\t\t\t");
+
+ /*
+ * Sanity checking of the header.
+ */
+ if (header->nlpid != NLPID_ISIS) {
+ printf(" coding error!");
+ return(0);
+ }
+
+ if (header->version != ISIS_VERSION) {
+ printf(" version %d packet not supported", header->version);
+ return(0);
+ }
+
+ if ((header->id_length != SYSTEM_ID_LEN) && (header->id_length != 0)) {
+ printf(" system ID length of %d is not supported",
+ header->id_length);
+ return(0);
+ }
+
+ if ((header->fixed_len != ISIS_HEADER_SIZE)) {
+ printf(" bogus fixed header length %d should be %d",
+ header->fixed_len, ISIS_HEADER_SIZE);
+ return(0);
+ }
+
+ pdu_type = header->enc_pdu_type & PDU_TYPE_MASK;
+ if ((pdu_type != L1_LAN_IIH) && (pdu_type != L2_LAN_IIH)) {
+ printf(" PDU type (%d) not supported", pdu_type);
+ return;
+ }
+
+ if (header->pkt_version != ISIS_VERSION) {
+ printf(" version %d packet not supported", header->pkt_version);
+ return;
+ }
+
+ max_area = header->enc_max_area;
+ switch(max_area) {
+ case 0:
+ max_area = 3; /* silly shit */
+ break;
+ case 255:
+ printf(" bad packet -- 255 areas");
+ return(0);
+ default:
+ break;
+ }
+
+ switch (header->circuit) {
+ case 0:
+ printf(" PDU with circuit type 0");
+ return(0);
+ case 1:
+ if (pdu_type == L2_LAN_IIH) {
+ printf(" L2 IIH on an L1 only circuit");
+ return(0);
+ }
+ break;
+ case 2:
+ if (pdu_type == L1_LAN_IIH) {
+ printf(" L1 IIH on an L2 only circuit");
+ return(0);
+ }
+ break;
+ case 3:
+ break;
+ default:
+ printf(" unknown circuit type");
+ return(0);
+ }
+
+ holding_time = EXTRACT_16BITS(header->enc_holding_time);
+
+ packet_len = EXTRACT_16BITS(header->enc_packet_len);
+ if ((packet_len < ISIS_HEADER_SIZE) ||
+ (packet_len > length)) {
+ printf(" bogus packet length %d, real length %d", packet_len,
+ length);
+ return(0);
+ }
+
+ priority = header->enc_priority & PRIORITY_MASK;
+
+ /*
+ * Now print the fixed header.
+ */
+ switch (pdu_type) {
+ case L1_LAN_IIH:
+ printf(" L1 lan iih, ");
+ break;
+ case L2_LAN_IIH:
+ printf(" L2 lan iih, ");
+ break;
+ }
+
+ printf("circuit ");
+ switch (header->circuit) {
+ case 1:
+ printf("l1 only, ");
+ break;
+ case 2:
+ printf("l2 only, ");
+ break;
+ case 3:
+ printf("l1-l2, ");
+ break;
+ }
+
+ printf ("holding time %d ", holding_time);
+ printf ("\n\t\t\t source %s, length %d",
+ etheraddr_string(header->enc_source_id), packet_len);
+ printf ("\n\t\t\t lan id %s(%d)", etheraddr_string(header->enc_lan_id),
+ header->enc_lan_id[SYSTEM_ID_LEN]);
+
+ /*
+ * Now print the TLV's.
+ */
+ packet_len -= ISIS_HEADER_SIZE;
+ pptr = (char *)p + ISIS_HEADER_SIZE;
+ while (packet_len >= 2) {
+ if (pptr >= snapend) {
+ printf("\n\t\t\t packet exceeded snapshot");
+ return(1);
+ }
+ type = *pptr++;
+ len = *pptr++;
+ packet_len -= 2;
+ if (len > packet_len) {
+ break;
+ }
+
+ switch (type) {
+ case TLV_AREA_ADDR:
+ printf("\n\t\t\t area addresses");
+ tmp = len;
+ tptr = pptr;
+ alen = *tptr++;
+ while (tmp && alen < tmp) {
+ printf("\n\t\t\t ");
+ print_nsap(tptr, alen);
+ printf(" (%d)", alen);
+ tptr += alen;
+ tmp -= alen + 1;
+ alen = *tptr++;
+ }
+ break;
+ case TLV_ISNEIGH:
+ printf("\n\t\t\t neighbor addresses");
+ tmp = len;
+ tptr = pptr;
+ while (tmp >= sizeof(struct ether_addr)) {
+ printf("\n\t\t\t %s", etheraddr_string(tptr));
+ tmp -= sizeof(struct ether_addr);
+ tptr += sizeof(struct ether_addr);
+ }
+ break;
+ case TLV_PADDING:
+ printf("\n\t\t\t padding for %d bytes", len);
+ break;
+ case TLV_AUTHENT:
+ printf("\n\t\t\t authentication data");
+ default_print(pptr, len);
+ break;
+ default:
+ printf("\n\t\t\t unknown TLV, type %d, length %d", type, len);
+ break;
+ }
+
+ pptr += len;
+ packet_len -= len;
+ }
+
+ if (packet_len != 0) {
+ printf("\n\t\t\t %d straggler bytes", packet_len);
+ }
+ return(1);
+}
+
+/*
+ * Verify the checksum. See 8473-1, Appendix C, section C.4.
+ */
+
+static int
+osi_cksum(register const u_char *p, register int len, u_char *off)
{
- int x, y, f = (len - ((toff - p) + 1));
int32_t c0 = 0, c1 = 0;
- if ((cksum[0] = off[0]) == 0 && (cksum[1] = off[1]) == 0)
+ if ((off[0] == 0) && (off[1] == 0))
return 0;
- off[0] = off[1] = 0;
while (--len >= 0) {
c0 += *p++;
- c1 += c0;
c0 %= 255;
+ c1 += c0;
c1 %= 255;
}
- x = (c0 * f - c1);
- if (x < 0)
- x = 255 - (-x % 255);
- else
- x %= 255;
- y = -1 * (x + c0);
- if (y < 0)
- y = 255 - (-y % 255);
- else
- y %= 255;
-
- off[0] = x;
- off[1] = y;
-
- return (off[0] != cksum[0] || off[1] != cksum[1]);
+ return (c0 | c1);
}
diff --git a/contrib/tcpdump/print-llc.c b/contrib/tcpdump/print-llc.c
index ad57771..523c633 100644
--- a/contrib/tcpdump/print-llc.c
+++ b/contrib/tcpdump/print-llc.c
@@ -17,14 +17,16 @@
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
+ */
+
+/*
* Code by Matt Thomas, Digital Equipment Corporation
* with an awful lot of hacking by Jeffrey Mogul, DECWRL
*/
#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: print-llc.c,v 1.22 96/12/10 23:23:37 leres Exp $";
+static char rcsid[] =
+ "@(#)$Header: print-llc.c,v 1.20 96/07/23 14:17:25 leres Exp $";
#endif
#include <sys/param.h>
@@ -186,7 +188,7 @@ llc_print(const u_char *p, u_int length, u_int caplen,
caplen -= 4;
}
(void)printf(" len=%d", length);
- if (caplen > 0) {
+ if (caplen > 0 && !qflag) {
default_print_unaligned(p, caplen);
}
return(1);
diff --git a/contrib/tcpdump/print-nfs.c b/contrib/tcpdump/print-nfs.c
index c16291d..c705574 100644
--- a/contrib/tcpdump/print-nfs.c
+++ b/contrib/tcpdump/print-nfs.c
@@ -20,45 +20,222 @@
*/
#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: print-nfs.c,v 1.63 96/12/10 23:18:07 leres Exp $ (LBL)";
+static char rcsid[] =
+ "@(#) $Header: print-nfs.c,v 1.56 96/07/23 14:17:25 leres Exp $ (LBL)";
#endif
#include <sys/param.h>
#include <sys/time.h>
#include <sys/socket.h>
-#if __STDC__
-struct mbuf;
-struct rtentry;
-#endif
#include <net/if.h>
#include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <net/ethernet.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/ip_var.h>
+#ifdef SOLARIS
+#include <tiuser.h>
+#endif
#include <rpc/rpc.h>
+#include <rpc/pmap_prot.h>
#include <ctype.h>
-#include <pcap.h>
#include <stdio.h>
+#include <errno.h>
#include <string.h>
#include "interface.h"
#include "addrtoname.h"
+#include "extract.h" /* must come after interface.h */
-#include "nfsv2.h"
+#include "nfs.h"
#include "nfsfh.h"
-static void nfs_printfh(const u_int32_t *);
+static void nfs_printfh(const u_int32_t *, const int);
static void xid_map_enter(const struct rpc_msg *, const struct ip *);
-static int32_t xid_map_find(const struct rpc_msg *, const struct ip *);
-static void interp_reply(const struct rpc_msg *, u_int32_t, u_int);
+static int32_t xid_map_find(const struct rpc_msg *, const struct ip *, u_int32_t *,
+ u_int32_t *);
+static void interp_reply(const struct rpc_msg *, u_int32_t, u_int32_t, int);
+static const u_int32_t *parse_post_op_attr(const u_int32_t *, int);
+
+/*
+ * Mapping of old NFS Version 2 RPC numbers to generic numbers.
+ */
+u_int32_t nfsv3_procid[NFS_NPROCS] = {
+ NFSPROC_NULL,
+ NFSPROC_GETATTR,
+ NFSPROC_SETATTR,
+ NFSPROC_NOOP,
+ NFSPROC_LOOKUP,
+ NFSPROC_READLINK,
+ NFSPROC_READ,
+ NFSPROC_NOOP,
+ NFSPROC_WRITE,
+ NFSPROC_CREATE,
+ NFSPROC_REMOVE,
+ NFSPROC_RENAME,
+ NFSPROC_LINK,
+ NFSPROC_SYMLINK,
+ NFSPROC_MKDIR,
+ NFSPROC_RMDIR,
+ NFSPROC_READDIR,
+ NFSPROC_FSSTAT,
+ NFSPROC_NOOP,
+ NFSPROC_NOOP,
+ NFSPROC_NOOP,
+ NFSPROC_NOOP,
+ NFSPROC_NOOP,
+ NFSPROC_NOOP,
+ NFSPROC_NOOP,
+ NFSPROC_NOOP
+};
+
+const char *nfsv3_writemodes[NFSV3WRITE_NMODES] = {
+ "unstable",
+ "datasync",
+ "filesync"
+};
+
+static struct tok type2str[] = {
+ { NFNON, "NON" },
+ { NFREG, "REG" },
+ { NFDIR, "DIR" },
+ { NFBLK, "BLK" },
+ { NFCHR, "CHR" },
+ { NFLNK, "LNK" },
+ { NFFIFO, "FIFO" },
+ { 0, NULL }
+};
+
+/*
+ * Print out a 64-bit integer. This appears to be different on each system,
+ * try to make the best of it. The integer stored as 2 consecutive XDR
+ * encoded 32-bit integers, to which a pointer is passed.
+ *
+ * Assume that a system that has INT64_FORMAT defined, has a 64-bit
+ * integer datatype and can print it.
+ */
+
+#define UNSIGNED 0
+#define SIGNED 1
+#define HEX 2
+
+#define INT64_FORMAT "%qd"
+#define U_INT64_FORMAT "%qu"
+#define HEX_INT64_FORMAT "%qx"
+
+int print_int64(const u_int32_t *dp, int how)
+{
+ static char buf[32];
+#ifdef INT64_FORMAT
+ u_int64_t res;
+
+ res = ((u_int64_t)ntohl(dp[0]) << 32) | (u_int64_t)ntohl(dp[1]);
+ switch (how) {
+ case SIGNED:
+ printf(INT64_FORMAT, res);
+ break;
+ case UNSIGNED:
+ printf(U_INT64_FORMAT, res);
+ break;
+ case HEX:
+ printf(HEX_INT64_FORMAT, res);
+ break;
+ default:
+ return (0);
+ }
+#else
+ /*
+ * XXX - throw upper 32 bits away.
+ * Could also go for hex: printf("0x%x%x", dp[0], dp[1]);
+ */
+ if (how == SIGNED)
+ printf("%ld", (int)dp[1]);
+ else
+ printf("%lu", (unsigned int)dp[1]);
+#endif
+ return 1;
+}
+
+static const u_int32_t *
+parse_sattr3(const u_int32_t *dp, struct nfsv3_sattr *sa3)
+{
+ register const u_int32_t *ep = (u_int32_t *)snapend;
+
+ if (dp + 1 > ep)
+ return (0);
+ if ((sa3->sa_modeset = ntohl(*dp++))) {
+ if (dp + 1 > ep)
+ return (0);
+ sa3->sa_mode = ntohl(*dp++);
+ }
+
+ if (dp + 1 > ep)
+ return (0);
+ if ((sa3->sa_uidset = ntohl(*dp++))) {
+ if (dp + 1 > ep)
+ return (0);
+ sa3->sa_uid = ntohl(*dp++);
+ }
-static int nfserr; /* true if we error rather than trunc */
+ if (dp + 1 > ep)
+ return (0);
+ if ((sa3->sa_gidset = ntohl(*dp++))) {
+ if (dp + 1 > ep)
+ return (0);
+ sa3->sa_gid = ntohl(*dp++);
+ }
+
+ if (dp + 1 > ep)
+ return (0);
+ if ((sa3->sa_sizeset = ntohl(*dp++))) {
+ if (dp + 1 > ep)
+ return (0);
+ sa3->sa_size = ntohl(*dp++);
+ }
+
+ if (dp + 1 > ep)
+ return (0);
+ if ((sa3->sa_atimetype = ntohl(*dp++)) == NFSV3SATTRTIME_TOCLIENT) {
+ if (dp + 2 > ep)
+ return (0);
+ sa3->sa_atime.nfsv3_sec = ntohl(*dp++);
+ sa3->sa_atime.nfsv3_nsec = ntohl(*dp++);
+ }
+
+ if (dp + 1 > ep)
+ return (0);
+ if ((sa3->sa_mtimetype = ntohl(*dp++)) == NFSV3SATTRTIME_TOCLIENT) {
+ if (dp + 2 > ep)
+ return (0);
+ sa3->sa_mtime.nfsv3_sec = ntohl(*dp++);
+ sa3->sa_mtime.nfsv3_nsec = ntohl(*dp++);
+ }
+
+ return dp;
+}
+
+void
+print_sattr3(const struct nfsv3_sattr *sa3, int verbose)
+{
+ if (sa3->sa_modeset)
+ printf(" mode %o", sa3->sa_mode);
+ if (sa3->sa_uidset)
+ printf(" uid %u", sa3->sa_uid);
+ if (sa3->sa_gidset)
+ printf(" gid %u", sa3->sa_gid);
+ if (verbose > 1) {
+ if (sa3->sa_atimetype == NFSV3SATTRTIME_TOCLIENT)
+ printf(" atime %u.%06u", sa3->sa_atime.nfsv3_sec,
+ sa3->sa_atime.nfsv3_nsec);
+ if (sa3->sa_mtimetype == NFSV3SATTRTIME_TOCLIENT)
+ printf(" mtime %u.%06u", sa3->sa_mtime.nfsv3_sec,
+ sa3->sa_mtime.nfsv3_nsec);
+ }
+}
void
nfsreply_print(register const u_char *bp, u_int length,
@@ -66,9 +243,8 @@ nfsreply_print(register const u_char *bp, u_int length,
{
register const struct rpc_msg *rp;
register const struct ip *ip;
- int32_t proc;
+ u_int32_t proc, vers;
- nfserr = 0; /* assume no error */
rp = (const struct rpc_msg *)bp;
ip = (const struct ip *)bp2;
@@ -90,9 +266,8 @@ nfsreply_print(register const u_char *bp, u_int length,
"ok":"ERR",
length);
- proc = xid_map_find(rp, ip);
- if (proc >= 0)
- interp_reply(rp, (u_int32_t)proc, length);
+ if (xid_map_find(rp, ip, &proc, &vers) >= 0)
+ interp_reply(rp, proc, vers, length);
}
/*
@@ -100,29 +275,29 @@ nfsreply_print(register const u_char *bp, u_int length,
* If the packet was truncated, return 0.
*/
static const u_int32_t *
-parsereq(register const struct rpc_msg *rp, register u_int length)
+parsereq(register const struct rpc_msg *rp, register int length)
{
- register const u_int32_t *dp;
+ register const u_int32_t *dp = (u_int32_t *)&rp->rm_call.cb_cred;
+ register const u_int32_t *ep = (u_int32_t *)snapend;
register u_int len;
+ if (&dp[2] >= ep)
+ return (0);
/*
* find the start of the req data (if we captured it)
*/
- dp = (u_int32_t *)&rp->rm_call.cb_cred;
- TCHECK(dp[1]);
- len = ntohl(dp[1]);
- if (len < length) {
- dp += (len + (2 * sizeof(*dp) + 3)) / sizeof(*dp);
- TCHECK(dp[1]);
+ len = ntohl(dp[1]);
+ if (dp < ep && len < length) {
+ dp += (len + (2 * sizeof(u_int32_t) + 3)) / sizeof(u_int32_t);
len = ntohl(dp[1]);
- if (len < length) {
- dp += (len + (2 * sizeof(*dp) + 3)) / sizeof(*dp);
- TCHECK2(dp[0], 0);
- return (dp);
+ if ((dp < ep) && (len < length)) {
+ dp += (len + (2 * sizeof(u_int32_t) + 3)) /
+ sizeof(u_int32_t);
+ if (dp < ep)
+ return (dp);
}
}
-trunc:
- return (NULL);
+ return (0);
}
/*
@@ -130,13 +305,23 @@ trunc:
* If packet was truncated, return 0.
*/
static const u_int32_t *
-parsefh(register const u_int32_t *dp)
+parsefh(register const u_int32_t *dp, int v3)
{
- if (dp + 8 <= (u_int32_t *)snapend) {
- nfs_printfh(dp);
- return (dp + 8);
+ int len;
+
+ if (v3) {
+ if (dp + 1 > (u_int32_t *)snapend)
+ return (0);
+ len = (int)ntohl(*dp) / 4;
+ dp++;
+ } else
+ len = NFSX_V2FH / 4;
+
+ if (dp + len <= (u_int32_t *)snapend) {
+ nfs_printfh(dp, len);
+ return (dp + len);
}
- return (NULL);
+ return (0);
}
/*
@@ -151,7 +336,7 @@ parsefn(register const u_int32_t *dp)
/* Bail if we don't have the string length */
if ((u_char *)dp > snapend - sizeof(*dp))
- return (NULL);
+ return(0);
/* Fetch string length; convert to host order */
len = *dp++;
@@ -161,11 +346,9 @@ parsefn(register const u_int32_t *dp)
/* Update 32-bit pointer (NFS filenames padded to 32-bit boundaries) */
dp += ((len + 3) & ~3) / sizeof(*dp);
if ((u_char *)dp > snapend)
- return (NULL);
+ return (0);
/* XXX seems like we should be checking the length */
- putchar('"');
(void) fn_printn(cp, len, NULL);
- putchar('"');
return (dp);
}
@@ -176,11 +359,11 @@ parsefn(register const u_int32_t *dp)
* If packet was truncated (or there was some other error), return 0.
*/
static const u_int32_t *
-parsefhn(register const u_int32_t *dp)
+parsefhn(register const u_int32_t *dp, int v3)
{
- dp = parsefh(dp);
- if (dp == NULL)
- return (NULL);
+ dp = parsefh(dp, v3);
+ if (dp == 0)
+ return (0);
putchar(' ');
return (parsefn(dp));
}
@@ -192,10 +375,14 @@ nfsreq_print(register const u_char *bp, u_int length,
register const struct rpc_msg *rp;
register const struct ip *ip;
register const u_int32_t *dp;
+ register const u_char *ep;
+ nfstype type;
+ int proc, v3;
+ struct nfsv3_sattr sa3;
- nfserr = 0; /* assume no error */
rp = (const struct rpc_msg *)bp;
ip = (const struct ip *)bp2;
+ ep = snapend;
if (!nflag)
(void)printf("%s.%x > %s.nfs: %d",
ipaddr_string(&ip->ip_src),
@@ -212,171 +399,252 @@ nfsreq_print(register const u_char *bp, u_int length,
xid_map_enter(rp, ip); /* record proc number for later on */
- switch (ntohl(rp->rm_call.cb_proc)) {
-#ifdef NFSPROC_NOOP
+ v3 = (ntohl(rp->rm_call.cb_vers) == NFS_VER3);
+ proc = ntohl(rp->rm_call.cb_proc);
+
+ if (!v3 && proc < NFS_NPROCS)
+ proc = nfsv3_procid[proc];
+
+ switch (proc) {
case NFSPROC_NOOP:
printf(" nop");
return;
-#else
-#define NFSPROC_NOOP -1
-#endif
case NFSPROC_NULL:
printf(" null");
return;
case NFSPROC_GETATTR:
printf(" getattr");
- if ((dp = parsereq(rp, length)) != NULL && parsefh(dp) != NULL)
+ if ((dp = parsereq(rp, length)) != 0 && parsefh(dp, v3) != 0)
return;
break;
case NFSPROC_SETATTR:
printf(" setattr");
- if ((dp = parsereq(rp, length)) != NULL && parsefh(dp) != NULL)
+ if ((dp = parsereq(rp, length)) != 0 && parsefh(dp, v3) != 0)
return;
break;
-#if NFSPROC_ROOT != NFSPROC_NOOP
- case NFSPROC_ROOT:
- printf(" root");
- break;
-#endif
case NFSPROC_LOOKUP:
printf(" lookup");
- if ((dp = parsereq(rp, length)) != NULL && parsefhn(dp) != NULL)
+ if ((dp = parsereq(rp, length)) != 0 && parsefhn(dp, v3) != 0)
+ return;
+ break;
+
+ case NFSPROC_ACCESS:
+ printf(" access");
+ if ((dp = parsereq(rp, length)) != 0 &&
+ (dp = parsefh(dp, v3)) != 0) {
+ TCHECK(*dp);
+ printf(" %04x", ntohl(dp[0]));
return;
+ }
break;
case NFSPROC_READLINK:
printf(" readlink");
- if ((dp = parsereq(rp, length)) != NULL && parsefh(dp) != NULL)
+ if ((dp = parsereq(rp, length)) != 0 && parsefh(dp, v3) != 0)
return;
break;
case NFSPROC_READ:
printf(" read");
- if ((dp = parsereq(rp, length)) != NULL &&
- (dp = parsefh(dp)) != NULL) {
- TCHECK2(dp[0], 3 * sizeof(*dp));
- printf(" %u bytes @ %u",
- (u_int32_t)ntohl(dp[1]),
- (u_int32_t)ntohl(dp[0]));
+ if ((dp = parsereq(rp, length)) != 0 &&
+ (dp = parsefh(dp, v3)) != 0) {
+ if (v3) {
+ TCHECK2(*dp, 3 * sizeof(*dp));
+ printf(" %lu bytes @ ", ntohl(dp[2]));
+ print_int64(dp, UNSIGNED);
+ } else {
+ TCHECK2(*dp, 2 * sizeof(*dp));
+ printf(" %lu bytes @ %lu",
+ ntohl(dp[1]), ntohl(dp[0]));
+ }
return;
}
break;
-#if NFSPROC_WRITECACHE != NFSPROC_NOOP
- case NFSPROC_WRITECACHE:
- printf(" writecache");
- if ((dp = parsereq(rp, length)) != NULL &&
- (dp = parsefh(dp)) != NULL) {
- TCHECK2(dp[0], 4 * sizeof(*dp));
- printf(" %u (%u) bytes @ %u (%u)",
- (u_int32_t)ntohl(dp[3]),
- (u_int32_t)ntohl(dp[2]),
- (u_int32_t)ntohl(dp[1]),
- (u_int32_t)ntohl(dp[0]));
- return;
- }
- break;
-#endif
case NFSPROC_WRITE:
printf(" write");
- if ((dp = parsereq(rp, length)) != NULL &&
- (dp = parsefh(dp)) != NULL) {
- TCHECK2(dp[0], 4 * sizeof(*dp));
- printf(" %u (%u) bytes @ %u (%u)",
- (u_int32_t)ntohl(dp[3]),
- (u_int32_t)ntohl(dp[2]),
- (u_int32_t)ntohl(dp[1]),
- (u_int32_t)ntohl(dp[0]));
+ if ((dp = parsereq(rp, length)) != 0 &&
+ (dp = parsefh(dp, v3)) != 0) {
+ if (v3) {
+ TCHECK2(*dp, 3 * sizeof(*dp));
+ printf(" %lu bytes @ ", ntohl(dp[4]));
+ print_int64(dp, UNSIGNED);
+ if (vflag) {
+ dp += 3;
+ TCHECK2(*dp, sizeof(*dp));
+ printf(" <%s>",
+ nfsv3_writemodes[ntohl(*dp)]);
+ }
+ } else {
+ TCHECK2(*dp, 4 * sizeof(*dp));
+ printf(" %lu (%lu) bytes @ %lu (%lu)",
+ ntohl(dp[3]), ntohl(dp[2]),
+ ntohl(dp[1]), ntohl(dp[0]));
+ }
return;
}
break;
case NFSPROC_CREATE:
printf(" create");
- if ((dp = parsereq(rp, length)) != NULL && parsefhn(dp) != NULL)
+ if ((dp = parsereq(rp, length)) != 0 && parsefhn(dp, v3) != 0)
return;
break;
+ case NFSPROC_MKDIR:
+ printf(" mkdir");
+ if ((dp = parsereq(rp, length)) != 0 && parsefhn(dp, v3) != 0)
+ return;
+ break;
+
+ case NFSPROC_SYMLINK:
+ printf(" symlink");
+ if ((dp = parsereq(rp, length)) != 0 &&
+ (dp = parsefhn(dp, v3)) != 0) {
+ fputs(" -> ", stdout);
+ if (v3 && (dp = parse_sattr3(dp, &sa3)) == 0)
+ break;
+ if (parsefn(dp) == 0)
+ break;
+ if (v3 && vflag)
+ print_sattr3(&sa3, vflag);
+ return;
+ }
+ break;
+
+ case NFSPROC_MKNOD:
+ printf(" mknod");
+ if ((dp = parsereq(rp, length)) != 0 &&
+ (dp = parsefhn(dp, v3)) != 0) {
+ if (dp + 1 > (u_int32_t *)snapend)
+ break;
+ type = (nfstype)ntohl(*dp++);
+ if ((dp = parse_sattr3(dp, &sa3)) == 0)
+ break;
+ printf(" %s", tok2str(type2str, "unk-ft %d", type));
+ if (vflag && (type == NFCHR || type == NFBLK)) {
+ if (dp + 2 > (u_int32_t *)snapend)
+ break;
+ printf(" %u/%u", ntohl(dp[0]), ntohl(dp[1]));
+ dp += 2;
+ }
+ if (vflag)
+ print_sattr3(&sa3, vflag);
+ return;
+ }
+ break;
+
case NFSPROC_REMOVE:
printf(" remove");
- if ((dp = parsereq(rp, length)) != NULL && parsefhn(dp) != NULL)
+ if ((dp = parsereq(rp, length)) != 0 && parsefhn(dp, v3) != 0)
+ return;
+ break;
+
+ case NFSPROC_RMDIR:
+ printf(" rmdir");
+ if ((dp = parsereq(rp, length)) != 0 && parsefhn(dp, v3) != 0)
return;
break;
case NFSPROC_RENAME:
printf(" rename");
- if ((dp = parsereq(rp, length)) != NULL &&
- (dp = parsefhn(dp)) != NULL) {
+ if ((dp = parsereq(rp, length)) != 0 &&
+ (dp = parsefhn(dp, v3)) != 0) {
fputs(" ->", stdout);
- if (parsefhn(dp) != NULL)
+ if (parsefhn(dp, v3) != 0)
return;
}
break;
case NFSPROC_LINK:
printf(" link");
- if ((dp = parsereq(rp, length)) != NULL &&
- (dp = parsefh(dp)) != NULL) {
+ if ((dp = parsereq(rp, length)) != 0 &&
+ (dp = parsefh(dp, v3)) != 0) {
fputs(" ->", stdout);
- if (parsefhn(dp) != NULL)
+ if (parsefhn(dp, v3) != 0)
return;
}
break;
- case NFSPROC_SYMLINK:
- printf(" symlink");
- if ((dp = parsereq(rp, length)) != NULL &&
- (dp = parsefhn(dp)) != NULL) {
- fputs(" -> ", stdout);
- if (parsefn(dp) != NULL)
- return;
+ case NFSPROC_READDIR:
+ printf(" readdir");
+ if ((dp = parsereq(rp, length)) != 0 &&
+ (dp = parsefh(dp, v3)) != 0) {
+ if (v3) {
+ TCHECK2(*dp, 20);
+ /*
+ * We shouldn't really try to interpret the
+ * offset cookie here.
+ */
+ printf(" %lu bytes @ ", ntohl(dp[4]));
+ print_int64(dp, SIGNED);
+ if (vflag)
+ printf(" verf %08lx%08lx", dp[2],
+ dp[3]);
+ } else {
+ TCHECK2(*dp, 2 * sizeof(*dp));
+ /*
+ * Print the offset as signed, since -1 is
+ * common, but offsets > 2^31 aren't.
+ */
+ printf(" %lu bytes @ %ld", ntohl(dp[1]),
+ ntohl(dp[0]));
+ }
+ return;
}
break;
- case NFSPROC_MKDIR:
- printf(" mkdir");
- if ((dp = parsereq(rp, length)) != NULL && parsefhn(dp) != NULL)
+ case NFSPROC_READDIRPLUS:
+ printf(" readdirplus");
+ if ((dp = parsereq(rp, length)) != 0 &&
+ (dp = parsefh(dp, v3)) != 0) {
+ TCHECK2(*dp, 20);
+ /*
+ * We don't try to interpret the offset
+ * cookie here.
+ */
+ printf(" %lu bytes @ ", ntohl(dp[4]));
+ print_int64(dp, SIGNED);
+ if (vflag)
+ printf(" max %lu verf %08lx%08lx",
+ ntohl(dp[5]), dp[2], dp[3]);
return;
+ }
break;
- case NFSPROC_RMDIR:
- printf(" rmdir");
- if ((dp = parsereq(rp, length)) != NULL && parsefhn(dp) != NULL)
+ case NFSPROC_FSSTAT:
+ printf(" fsstat");
+ if ((dp = parsereq(rp, length)) != 0 && parsefh(dp, v3) != 0)
return;
break;
- case NFSPROC_READDIR:
- printf(" readdir");
- if ((dp = parsereq(rp, length)) != NULL &&
- (dp = parsefh(dp)) != NULL) {
- TCHECK2(dp[0], 2 * sizeof(*dp));
- /*
- * Print the offset as signed, since -1 is common,
- * but offsets > 2^31 aren't.
- */
- printf(" %u bytes @ %d",
- (u_int32_t)ntohl(dp[1]),
- (u_int32_t)ntohl(dp[0]));
- return;
- }
+ case NFSPROC_FSINFO:
+ printf(" fsinfo");
+ break;
+
+ case NFSPROC_PATHCONF:
+ printf(" pathconf");
break;
- case NFSPROC_STATFS:
- printf(" statfs");
- if ((dp = parsereq(rp, length)) != NULL && parsefh(dp) != NULL)
+ case NFSPROC_COMMIT:
+ printf(" commit");
+ if ((dp = parsereq(rp, length)) != 0 &&
+ (dp = parsefh(dp, v3)) != 0) {
+ printf(" %lu bytes @ ", ntohl(dp[2]));
+ print_int64(dp, UNSIGNED);
return;
+ }
break;
default:
- printf(" proc-%u", (u_int32_t)ntohl(rp->rm_call.cb_proc));
+ printf(" proc-%lu", ntohl(rp->rm_call.cb_proc));
return;
}
trunc:
- if (!nfserr)
- fputs(" [|nfs]", stdout);
+ fputs(" [|nfs]", stdout);
}
/*
@@ -389,29 +657,32 @@ trunc:
* additional hacking on the parser code.
*/
static void
-nfs_printfh(register const u_int32_t *dp)
+nfs_printfh(register const u_int32_t *dp, const int len)
{
my_fsid fsid;
ino_t ino;
char *sfsname = NULL;
- Parse_fh((caddr_t *)dp, &fsid, &ino, NULL, &sfsname, 0);
+ Parse_fh((caddr_t*)dp, len, &fsid, &ino, NULL, &sfsname, 0);
if (sfsname) {
- /* file system ID is ASCII, not numeric, for this server OS */
- static char temp[NFS_FHSIZE+1];
+ /* file system ID is ASCII, not numeric, for this server OS */
+ static char temp[NFSX_V3FHMAX+1];
- /* Make sure string is null-terminated */
- strncpy(temp, sfsname, NFS_FHSIZE);
- /* Remove trailing spaces */
- sfsname = strchr(temp, ' ');
- if (sfsname)
- *sfsname = 0;
+ /* Make sure string is null-terminated */
+ strncpy(temp, sfsname, NFSX_V3FHMAX);
+ /* Remove trailing spaces */
+ sfsname = strchr(temp, ' ');
+ if (sfsname)
+ *sfsname = 0;
- (void)printf(" fh %s/%u", temp, (u_int32_t)ino);
- } else {
- (void)printf(" fh %u,%u/%u",
- fsid.Fsid_dev.Major, fsid.Fsid_dev.Minor, (u_int32_t)ino);
+ (void)printf(" fh %s/%u", temp, (u_int32_t)ino);
+ }
+ else {
+ (void)printf(" fh %u,%u/%u",
+ fsid.fsid_dev.Major,
+ fsid.fsid_dev.Minor,
+ (u_int32_t)ino);
}
}
@@ -426,6 +697,7 @@ struct xid_map_entry {
struct in_addr client; /* client IP address (net order) */
struct in_addr server; /* server IP address (net order) */
u_int32_t proc; /* call proc number (host order) */
+ u_int32_t vers; /* program version (host order) */
};
/*
@@ -455,11 +727,13 @@ xid_map_enter(const struct rpc_msg *rp, const struct ip *ip)
xmep->client = ip->ip_src;
xmep->server = ip->ip_dst;
xmep->proc = ntohl(rp->rm_call.cb_proc);
+ xmep->vers = ntohl(rp->rm_call.cb_vers);
}
/* Returns NFSPROC_xxx or -1 on failure */
-static int32_t
-xid_map_find(const struct rpc_msg *rp, const struct ip *ip)
+static int
+xid_map_find(const struct rpc_msg *rp, const struct ip *ip, u_int32_t *proc,
+ u_int32_t *vers)
{
int i;
struct xid_map_entry *xmep;
@@ -475,14 +749,16 @@ xid_map_find(const struct rpc_msg *rp, const struct ip *ip)
xmep->server.s_addr == sip) {
/* match */
xid_map_hint = i;
- return ((int32_t)xmep->proc);
+ *proc = xmep->proc;
+ *vers = xmep->vers;
+ return 0;
}
if (++i >= XIDMAPSIZE)
i = 0;
} while (i != xid_map_hint);
/* search failed */
- return (-1);
+ return(-1);
}
/*
@@ -494,10 +770,11 @@ xid_map_find(const struct rpc_msg *rp, const struct ip *ip)
* If the packet was truncated, return 0.
*/
static const u_int32_t *
-parserep(register const struct rpc_msg *rp, register u_int length)
+parserep(register const struct rpc_msg *rp, register int length)
{
register const u_int32_t *dp;
- u_int len;
+ register const u_int32_t *ep = (const u_int32_t *)snapend;
+ int len;
enum accept_stat astat;
/*
@@ -516,15 +793,17 @@ parserep(register const struct rpc_msg *rp, register u_int length)
* which is an "enum" and so occupies one 32-bit word.
*/
dp = ((const u_int32_t *)&rp->rm_reply) + 1;
- TCHECK2(dp[0], 1);
+ if (&dp[1] >= ep)
+ return(0);
len = ntohl(dp[1]);
if (len >= length)
- return (NULL);
+ return(0);
/*
* skip past the ar_verf credentials.
*/
dp += (len + (2*sizeof(u_int32_t) + 3)) / sizeof(u_int32_t);
- TCHECK2(dp[0], 0);
+ if (dp >= ep)
+ return(0);
/*
* now we can check the ar_stat field
@@ -537,209 +816,440 @@ parserep(register const struct rpc_msg *rp, register u_int length)
case PROG_UNAVAIL:
printf(" PROG_UNAVAIL");
- nfserr = 1; /* suppress trunc string */
- return (NULL);
+ return(0);
case PROG_MISMATCH:
printf(" PROG_MISMATCH");
- nfserr = 1; /* suppress trunc string */
- return (NULL);
+ return(0);
case PROC_UNAVAIL:
printf(" PROC_UNAVAIL");
- nfserr = 1; /* suppress trunc string */
- return (NULL);
+ return(0);
case GARBAGE_ARGS:
printf(" GARBAGE_ARGS");
- nfserr = 1; /* suppress trunc string */
- return (NULL);
+ return(0);
case SYSTEM_ERR:
printf(" SYSTEM_ERR");
- nfserr = 1; /* suppress trunc string */
- return (NULL);
+ return(0);
default:
printf(" ar_stat %d", astat);
- nfserr = 1; /* suppress trunc string */
- return (NULL);
+ return(0);
}
/* successful return */
- if ((sizeof(astat) + ((u_char *)dp)) < snapend)
- return ((u_int32_t *) (sizeof(astat) + ((char *)dp)));
+ if ((sizeof(astat) + ((char *)dp)) < (char *)ep)
+ return((u_int32_t *) (sizeof(astat) + ((char *)dp)));
-trunc:
- return (NULL);
+ return (0);
+}
+
+#define T2CHECK(p, l) if ((u_char *)(p) > ((u_char *)snapend) - l) return(0)
+
+/*
+ * Not all systems have strerror().
+ */
+static char *
+strerr(int errno)
+{
+
+ return (strerror(errno));
}
static const u_int32_t *
-parsestatus(const u_int32_t *dp)
+parsestatus(const u_int32_t *dp, int *er)
{
- register int errnum;
-
- TCHECK(dp[0]);
- errnum = ntohl(dp[0]);
- if (errnum != 0) {
- if (!qflag)
- printf(" ERROR: %s", pcap_strerror(errnum));
- nfserr = 1; /* suppress trunc string */
- return (NULL);
+ int errno;
+ T2CHECK(dp, 4);
+
+ errno = ntohl(dp[0]);
+ if (er)
+ *er = errno;
+ if (errno != 0 && !qflag) {
+ char *errmsg;
+
+ errmsg = strerr(errno);
+ if (errmsg)
+ printf(" ERROR: '%s'", errmsg);
+ else
+ printf(" ERROR: %d", errno);
}
return (dp + 1);
-trunc:
- return (NULL);
}
-static struct tok type2str[] = {
- { NFNON, "NON" },
- { NFREG, "REG" },
- { NFDIR, "DIR" },
- { NFBLK, "BLK" },
- { NFCHR, "CHR" },
- { NFLNK, "LNK" },
- { 0, NULL }
-};
-
static const u_int32_t *
-parsefattr(const u_int32_t *dp, int verbose)
+parsefattr(const u_int32_t *dp, int verbose, int v3)
{
- const struct nfsv2_fattr *fap;
+ const struct nfs_fattr *fap;
- fap = (const struct nfsv2_fattr *)dp;
+ T2CHECK(dp, 5 * sizeof(*dp));
+
+ fap = (const struct nfs_fattr *)dp;
if (verbose) {
- TCHECK(fap->fa_nfssize);
- printf(" %s %o ids %u/%u sz %u ",
- tok2str(type2str, "unk-ft %d ",
- (u_int32_t)ntohl(fap->fa_type)),
- (u_int32_t)ntohl(fap->fa_mode),
- (u_int32_t)ntohl(fap->fa_uid),
- (u_int32_t)ntohl(fap->fa_gid),
- (u_int32_t)ntohl(fap->fa_nfssize));
+ printf(" %s %o ids %d/%d",
+ tok2str(type2str, "unk-ft %d ", ntohl(fap->fa_type)),
+ ntohl(fap->fa_mode), ntohl(fap->fa_uid),
+ ntohl(fap->fa_gid));
+ if (v3) {
+ T2CHECK(dp, 7 * sizeof(*dp));
+ printf(" sz ");
+ print_int64((u_int32_t *)&fap->fa3_size, UNSIGNED);
+ putchar(' ');
+ }
+ else {
+ T2CHECK(dp, 6 * sizeof(*dp));
+ printf(" sz %d ", ntohl(fap->fa2_size));
+ }
}
/* print lots more stuff */
if (verbose > 1) {
- TCHECK(fap->fa_nfsfileid);
- printf("nlink %u rdev %x fsid %x nodeid %x a/m/ctime ",
- (u_int32_t)ntohl(fap->fa_nlink),
- (u_int32_t)ntohl(fap->fa_nfsrdev),
- (u_int32_t)ntohl(fap->fa_nfsfsid),
- (u_int32_t)ntohl(fap->fa_nfsfileid));
- TCHECK(fap->fa_nfsatime);
- printf("%u.%06u ",
- (u_int32_t)ntohl(fap->fa_nfsatime.nfs_sec),
- (u_int32_t)ntohl(fap->fa_nfsatime.nfs_usec));
- TCHECK(fap->fa_nfsmtime);
- printf("%u.%06u ",
- (u_int32_t)ntohl(fap->fa_nfsmtime.nfs_sec),
- (u_int32_t)ntohl(fap->fa_nfsmtime.nfs_usec));
- TCHECK(fap->fa_nfsctime);
- printf("%u.%06u ",
- (u_int32_t)ntohl(fap->fa_nfsctime.nfs_sec),
- (u_int32_t)ntohl(fap->fa_nfsctime.nfs_usec));
+ if (v3) {
+ T2CHECK(dp, 64);
+ printf("nlink %d rdev %d/%d ",
+ ntohl(fap->fa_nlink),
+ ntohl(fap->fa3_rdev.specdata1),
+ ntohl(fap->fa3_rdev.specdata2));
+ printf("fsid ");
+ print_int64((u_int32_t *)&fap->fa2_fsid, HEX);
+ printf(" nodeid ");
+ print_int64((u_int32_t *)&fap->fa2_fileid, HEX);
+ printf(" a/m/ctime %u.%06u ",
+ ntohl(fap->fa3_atime.nfsv3_sec),
+ ntohl(fap->fa3_atime.nfsv3_nsec));
+ printf("%u.%06u ",
+ ntohl(fap->fa3_mtime.nfsv3_sec),
+ ntohl(fap->fa3_mtime.nfsv3_nsec));
+ printf("%u.%06u ",
+ ntohl(fap->fa3_ctime.nfsv3_sec),
+ ntohl(fap->fa3_ctime.nfsv3_nsec));
+ } else {
+ T2CHECK(dp, 48);
+ printf("nlink %d rdev %x fsid %x nodeid %x a/m/ctime ",
+ ntohl(fap->fa_nlink), ntohl(fap->fa2_rdev),
+ ntohl(fap->fa2_fsid), ntohl(fap->fa2_fileid));
+ printf("%u.%06u ",
+ ntohl(fap->fa2_atime.nfsv2_sec),
+ ntohl(fap->fa2_atime.nfsv2_usec));
+ printf("%u.%06u ",
+ ntohl(fap->fa2_mtime.nfsv2_sec),
+ ntohl(fap->fa2_mtime.nfsv2_usec));
+ printf("%u.%06u ",
+ ntohl(fap->fa2_ctime.nfsv2_sec),
+ ntohl(fap->fa2_ctime.nfsv2_usec));
+ }
}
- return ((const u_int32_t *)&fap[1]);
-trunc:
- return (NULL);
+ return ((const u_int32_t *)((unsigned char *)dp +
+ (v3 ? NFSX_V3FATTR : NFSX_V2FATTR)));
}
static int
-parseattrstat(const u_int32_t *dp, int verbose)
+parseattrstat(const u_int32_t *dp, int verbose, int v3)
{
+ int er;
- dp = parsestatus(dp);
- if (dp == NULL)
+ dp = parsestatus(dp, &er);
+ if (dp == NULL || er)
return (0);
- return (parsefattr(dp, verbose) != NULL);
+ return ((long)parsefattr(dp, verbose, v3));
}
static int
parsediropres(const u_int32_t *dp)
{
+ int er;
- dp = parsestatus(dp);
- if (dp == NULL)
+ if (!(dp = parsestatus(dp, &er)) || er)
return (0);
- dp = parsefh(dp);
+ dp = parsefh(dp, 0);
if (dp == NULL)
return (0);
- return (parsefattr(dp, vflag) != NULL);
+ return (parsefattr(dp, vflag, 0) != NULL);
}
static int
-parselinkres(const u_int32_t *dp)
+parselinkres(const u_int32_t *dp, int v3)
{
- dp = parsestatus(dp);
- if (dp == NULL)
- return (0);
+ int er;
+ dp = parsestatus(dp, &er);
+ if (dp == NULL || er)
+ return(0);
+ if (v3 && !(dp = parse_post_op_attr(dp, vflag)))
+ return (0);
putchar(' ');
return (parsefn(dp) != NULL);
}
static int
-parsestatfs(const u_int32_t *dp)
+parsestatfs(const u_int32_t *dp, int v3)
{
- const struct nfsv2_statfs *sfsp;
+ const struct nfs_statfs *sfsp;
+ int er;
- dp = parsestatus(dp);
- if (dp == NULL)
- return (0);
+ dp = parsestatus(dp, &er);
+ if (dp == NULL || (!v3 && er))
+ return(0);
- if (!qflag) {
- sfsp = (const struct nfsv2_statfs *)dp;
- TCHECK(sfsp->sf_bavail);
- printf(" tsize %u bsize %u blocks %u bfree %u bavail %u",
- (u_int32_t)ntohl(sfsp->sf_tsize),
- (u_int32_t)ntohl(sfsp->sf_bsize),
- (u_int32_t)ntohl(sfsp->sf_blocks),
- (u_int32_t)ntohl(sfsp->sf_bfree),
- (u_int32_t)ntohl(sfsp->sf_bavail));
+ if (qflag)
+ return(1);
+
+ if (v3) {
+ if (vflag)
+ printf(" POST:");
+ if (!(dp = parse_post_op_attr(dp, vflag)))
+ return (0);
+ }
+
+ T2CHECK(dp, (v3 ? NFSX_V3STATFS : NFSX_V2STATFS));
+
+ sfsp = (const struct nfs_statfs *)dp;
+
+ if (v3) {
+ printf(" tbytes ");
+ print_int64((u_int32_t *)&sfsp->sf_tbytes, UNSIGNED);
+ printf(" fbytes ");
+ print_int64((u_int32_t *)&sfsp->sf_fbytes, UNSIGNED);
+ printf(" abytes ");
+ print_int64((u_int32_t *)&sfsp->sf_abytes, UNSIGNED);
+ if (vflag) {
+ printf(" tfiles ");
+ print_int64((u_int32_t *)&sfsp->sf_tfiles, UNSIGNED);
+ printf(" ffiles ");
+ print_int64((u_int32_t *)&sfsp->sf_ffiles, UNSIGNED);
+ printf(" afiles ");
+ print_int64((u_int32_t *)&sfsp->sf_afiles, UNSIGNED);
+ printf(" invar %lu", ntohl(sfsp->sf_invarsec));
+ }
+ } else {
+ printf(" tsize %d bsize %d blocks %d bfree %d bavail %d",
+ ntohl(sfsp->sf_tsize), ntohl(sfsp->sf_bsize),
+ ntohl(sfsp->sf_blocks), ntohl(sfsp->sf_bfree),
+ ntohl(sfsp->sf_bavail));
}
return (1);
-trunc:
- return (0);
}
static int
parserddires(const u_int32_t *dp)
{
- dp = parsestatus(dp);
- if (dp == NULL)
+ int er;
+
+ dp = parsestatus(dp, &er);
+ if (dp == 0 || er)
+ return (0);
+ if (qflag)
+ return (1);
+
+ T2CHECK(dp, 12);
+ printf(" offset %x size %d ", ntohl(dp[0]), ntohl(dp[1]));
+ if (dp[2] != 0)
+ printf("eof");
+
+ return (1);
+}
+
+static const u_int32_t *
+parse_wcc_attr(const u_int32_t *dp)
+{
+ printf(" sz ");
+ print_int64(dp, UNSIGNED);
+ printf(" mtime %u.%06u ctime %u.%06u", ntohl(dp[2]), ntohl(dp[3]),
+ ntohl(dp[4]), ntohl(dp[5]));
+ return (dp + 6);
+}
+
+/*
+ * Pre operation attributes. Print only if vflag > 1.
+ */
+static const u_int32_t *
+parse_pre_op_attr(const u_int32_t *dp, int verbose)
+{
+ T2CHECK(dp, 4);
+ if (!ntohl(dp[0]))
+ return (dp + 1);
+ dp++;
+ T2CHECK(dp, 24);
+ if (verbose > 1) {
+ return parse_wcc_attr(dp);
+ } else {
+ /* If not verbose enough, just skip over wcc_attr */
+ return (dp + 6);
+ }
+}
+
+/*
+ * Post operation attributes are printed if vflag >= 1
+ */
+static const u_int32_t *
+parse_post_op_attr(const u_int32_t *dp, int verbose)
+{
+ T2CHECK(dp, 4);
+ if (!ntohl(dp[0]))
+ return (dp + 1);
+ dp++;
+ if (verbose) {
+ return parsefattr(dp, verbose, 1);
+ } else
+ return (dp + (NFSX_V3FATTR / sizeof (u_int32_t)));
+}
+
+static const u_int32_t *
+parse_wcc_data(const u_int32_t *dp, int verbose)
+{
+ if (verbose > 1)
+ printf(" PRE:");
+ if (!(dp = parse_pre_op_attr(dp, verbose)))
+ return (0);
+
+ if (verbose)
+ printf(" POST:");
+ return parse_post_op_attr(dp, verbose);
+}
+
+static const u_int32_t *
+parsecreateopres(const u_int32_t *dp, int verbose)
+{
+ int er;
+
+ if (!(dp = parsestatus(dp, &er)))
return (0);
- if (!qflag) {
- TCHECK(dp[0]);
- printf(" offset %x", (u_int32_t)ntohl(dp[0]));
- TCHECK(dp[1]);
- printf(" size %u", (u_int32_t)ntohl(dp[1]));
- TCHECK(dp[2]);
- if (dp[2] != 0)
- printf(" eof");
+ if (er)
+ dp = parse_wcc_data(dp, verbose);
+ else {
+ T2CHECK(dp, 4);
+ if (!ntohl(dp[0]))
+ return (dp + 1);
+ dp++;
+ if (!(dp = parsefh(dp, 1)))
+ return (0);
+ if (verbose) {
+ if (!(dp = parse_post_op_attr(dp, verbose)))
+ return (0);
+ if (vflag > 1) {
+ printf("dir attr:");
+ dp = parse_wcc_data(dp, verbose);
+ }
+ }
}
+ return (dp);
+}
+
+static int
+parsewccres(const u_int32_t *dp, int verbose)
+{
+ int er;
+
+ if (!(dp = parsestatus(dp, &er)))
+ return (0);
+ return parse_wcc_data(dp, verbose) != 0;
+}
+
+static const u_int32_t *
+parsev3rddirres(const u_int32_t *dp, int verbose)
+{
+ int er;
+
+ if (!(dp = parsestatus(dp, &er)))
+ return (0);
+ if (vflag)
+ printf(" POST:");
+ if (!(dp = parse_post_op_attr(dp, verbose)))
+ return (0);
+ if (er)
+ return dp;
+ if (vflag) {
+ T2CHECK(dp, 8);
+ printf(" verf %08lx%08lx", dp[0], dp[1]);
+ dp += 2;
+ }
+ return dp;
+}
+
+static int
+parsefsinfo(const u_int32_t *dp)
+{
+ struct nfsv3_fsinfo *sfp;
+ int er;
+ if (!(dp = parsestatus(dp, &er)))
+ return (0);
+ if (vflag)
+ printf(" POST:");
+ if (!(dp = parse_post_op_attr(dp, vflag)))
+ return (0);
+ if (er)
+ return (1);
+
+ T2CHECK(dp, sizeof (struct nfsv3_fsinfo));
+
+ sfp = (struct nfsv3_fsinfo *)dp;
+ printf(" rtmax %lu rtpref %lu wtmax %lu wtpref %lu dtpref %lu",
+ ntohl(sfp->fs_rtmax), ntohl(sfp->fs_rtpref),
+ ntohl(sfp->fs_wtmax), ntohl(sfp->fs_wtpref),
+ ntohl(sfp->fs_dtpref));
+ if (vflag) {
+ printf(" rtmult %lu wtmult %lu maxfsz ",
+ ntohl(sfp->fs_rtmult), ntohl(sfp->fs_wtmult));
+ print_int64((u_int32_t *)&sfp->fs_maxfilesize, UNSIGNED);
+ printf(" delta %u.%06u ", ntohl(sfp->fs_timedelta.nfsv3_sec),
+ ntohl(sfp->fs_timedelta.nfsv3_nsec));
+ }
return (1);
-trunc:
- return (0);
}
+static int
+parsepathconf(const u_int32_t *dp)
+{
+ int er;
+ struct nfsv3_pathconf *spp;
+
+ if (!(dp = parsestatus(dp, &er)))
+ return (0);
+ if (vflag)
+ printf(" POST:");
+ if (!(dp = parse_post_op_attr(dp, vflag)))
+ return (0);
+ if (er)
+ return (1);
+
+ T2CHECK(dp, sizeof (struct nfsv3_pathconf));
+
+ spp = (struct nfsv3_pathconf *)dp;
+
+ printf(" linkmax %lu namemax %lu %s %s %s %s",
+ ntohl(spp->pc_linkmax),
+ ntohl(spp->pc_namemax),
+ ntohl(spp->pc_notrunc) ? "notrunc" : "",
+ ntohl(spp->pc_chownrestricted) ? "chownres" : "",
+ ntohl(spp->pc_caseinsensitive) ? "igncase" : "",
+ ntohl(spp->pc_casepreserving) ? "keepcase" : "");
+ return (0);
+}
+
static void
-interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int length)
+interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int32_t vers, int length)
{
register const u_int32_t *dp;
+ register int v3;
+ register const u_char *ep = snapend;
+ int er;
+
+ v3 = (vers == NFS_VER3);
+
+ if (!v3 && proc < NFS_NPROCS)
+ proc = nfsv3_procid[proc];
switch (proc) {
-#ifdef NFSPROC_NOOP
case NFSPROC_NOOP:
printf(" nop");
return;
-#else
-#define NFSPROC_NOOP -1
-#endif
+
case NFSPROC_NULL:
printf(" null");
return;
@@ -747,122 +1257,294 @@ interp_reply(const struct rpc_msg *rp, u_int32_t proc, u_int length)
case NFSPROC_GETATTR:
printf(" getattr");
dp = parserep(rp, length);
- if (dp != NULL && parseattrstat(dp, !qflag) != 0)
+ if (dp != 0 && parseattrstat(dp, !qflag, v3) != 0)
return;
break;
case NFSPROC_SETATTR:
printf(" setattr");
- dp = parserep(rp, length);
- if (dp != NULL && parseattrstat(dp, !qflag) != 0)
+ if (!(dp = parserep(rp, length)))
return;
+ if (v3) {
+ if (parsewccres(dp, vflag))
+ return;
+ } else {
+ if (parseattrstat(dp, !qflag, 0) != 0)
+ return;
+ }
break;
-#if NFSPROC_ROOT != NFSPROC_NOOP
- case NFSPROC_ROOT:
- printf(" root");
- break;
-#endif
case NFSPROC_LOOKUP:
printf(" lookup");
- dp = parserep(rp, length);
- if (dp != NULL && parsediropres(dp) != 0)
- return;
+ if (!(dp = parserep(rp, length)))
+ break;
+ if (v3) {
+ if (!(dp = parsestatus(dp, &er)))
+ break;
+ if (er) {
+ if (vflag > 1) {
+ printf(" post dattr:");
+ dp = parse_post_op_attr(dp, vflag);
+ }
+ } else {
+ if (!(dp = parsefh(dp, v3)))
+ break;
+ if ((dp = parse_post_op_attr(dp, vflag)) &&
+ vflag > 1) {
+ printf(" post dattr:");
+ dp = parse_post_op_attr(dp, vflag);
+ }
+ }
+ if (dp)
+ return;
+ } else {
+ if (parsediropres(dp) != 0)
+ return;
+ }
break;
+ case NFSPROC_ACCESS:
+ printf(" access");
+ dp = parserep(rp, length);
+ if (!(dp = parsestatus(dp, &er)))
+ break;
+ if (vflag)
+ printf(" attr:");
+ if (!(dp = parse_post_op_attr(dp, vflag)))
+ break;
+ if (!er)
+ printf(" c %04x", ntohl(dp[0]));
+ return;
+
case NFSPROC_READLINK:
printf(" readlink");
dp = parserep(rp, length);
- if (dp != NULL && parselinkres(dp) != 0)
+ if (dp != 0 && parselinkres(dp, v3) != 0)
return;
break;
case NFSPROC_READ:
printf(" read");
- dp = parserep(rp, length);
- if (dp != NULL && parseattrstat(dp, vflag) != 0)
+ if (!(dp = parserep(rp, length)))
+ break;
+ if (v3) {
+ if (!(dp = parsestatus(dp, &er)))
+ break;
+ if (!(dp = parse_post_op_attr(dp, vflag)))
+ break;
+ if (er)
+ return;
+ if (vflag) {
+ TCHECK2(*dp, 8);
+ printf("%lu bytes", ntohl(dp[0]));
+ if (ntohl(dp[1]))
+ printf(" EOF");
+ }
return;
+ } else {
+ if (parseattrstat(dp, vflag, 0) != 0)
+ return;
+ }
break;
-#if NFSPROC_WRITECACHE != NFSPROC_NOOP
- case NFSPROC_WRITECACHE:
- printf(" writecache");
- break;
-#endif
case NFSPROC_WRITE:
printf(" write");
- dp = parserep(rp, length);
- if (dp != NULL && parseattrstat(dp, vflag) != 0)
- return;
+ if (!(dp = parserep(rp, length)))
+ break;
+ if (v3) {
+ if (!(dp = parsestatus(dp, &er)))
+ break;
+ if (!(dp = parse_wcc_data(dp, vflag)))
+ break;
+ if (er)
+ return;
+ if (vflag) {
+ TCHECK2(*dp, 4);
+ printf("%lu bytes", ntohl(dp[0]));
+ if (vflag > 1) {
+ TCHECK2(*dp, 4);
+ printf(" <%s>",
+ nfsv3_writemodes[ntohl(dp[1])]);
+ }
+ return;
+ }
+ } else {
+ if (parseattrstat(dp, vflag, v3) != 0)
+ return;
+ }
break;
case NFSPROC_CREATE:
printf(" create");
- dp = parserep(rp, length);
- if (dp != NULL && parsediropres(dp) != 0)
+ if (!(dp = parserep(rp, length)))
+ break;
+ if (v3) {
+ if (parsecreateopres(dp, vflag) != 0)
+ return;
+ } else {
+ if (parsediropres(dp) != 0)
+ return;
+ }
+ break;
+
+ case NFSPROC_MKDIR:
+ printf(" mkdir");
+ if (!(dp = parserep(rp, length)))
+ break;
+ if (v3) {
+ if (parsecreateopres(dp, vflag) != 0)
+ return;
+ } else {
+ if (parsediropres(dp) != 0)
+ return;
+ }
+ break;
+
+ case NFSPROC_SYMLINK:
+ printf(" symlink");
+ if (!(dp = parserep(rp, length)))
+ break;
+ if (v3) {
+ if (parsecreateopres(dp, vflag) != 0)
+ return;
+ } else {
+ if (parsestatus(dp, &er) != 0)
+ return;
+ }
+ break;
+
+ case NFSPROC_MKNOD:
+ printf(" mknod");
+ if (!(dp = parserep(rp, length)))
+ break;
+ if (parsecreateopres(dp, vflag) != 0)
return;
break;
case NFSPROC_REMOVE:
printf(" remove");
- dp = parserep(rp, length);
- if (dp != NULL && parsestatus(dp) != 0)
- return;
+ if (!(dp = parserep(rp, length)))
+ break;
+ if (v3) {
+ if (parsewccres(dp, vflag))
+ return;
+ } else {
+ if (parsestatus(dp, &er) != 0)
+ return;
+ }
+ break;
+
+ case NFSPROC_RMDIR:
+ printf(" rmdir");
+ if (!(dp = parserep(rp, length)))
+ break;
+ if (v3) {
+ if (parsewccres(dp, vflag))
+ return;
+ } else {
+ if (parsestatus(dp, &er) != 0)
+ return;
+ }
break;
case NFSPROC_RENAME:
printf(" rename");
- dp = parserep(rp, length);
- if (dp != NULL && parsestatus(dp) != 0)
+ if (!(dp = parserep(rp, length)))
+ break;
+ if (v3) {
+ if (!(dp = parsestatus(dp, &er)))
+ break;
+ if (vflag) {
+ printf(" from:");
+ if (!(dp = parse_wcc_data(dp, vflag)))
+ break;
+ printf(" to:");
+ if (!(dp = parse_wcc_data(dp, vflag)))
+ break;
+ }
return;
+ } else {
+ if (parsestatus(dp, &er) != 0)
+ return;
+ }
break;
case NFSPROC_LINK:
printf(" link");
- dp = parserep(rp, length);
- if (dp != NULL && parsestatus(dp) != 0)
- return;
+ if (!(dp = parserep(rp, length)))
+ break;
+ if (v3) {
+ if (!(dp = parsestatus(dp, &er)))
+ break;
+ if (vflag) {
+ printf(" file POST:");
+ if (!(dp = parse_post_op_attr(dp, vflag)))
+ break;
+ printf(" dir:");
+ if (!(dp = parse_wcc_data(dp, vflag)))
+ break;
+ return;
+ }
+ } else {
+ if (parsestatus(dp, &er) != 0)
+ return;
+ }
break;
- case NFSPROC_SYMLINK:
- printf(" symlink");
- dp = parserep(rp, length);
- if (dp != NULL && parsestatus(dp) != 0)
+ case NFSPROC_READDIR:
+ printf(" readdir");
+ if (!(dp = parserep(rp, length)))
+ break;
+ if (v3) {
+ if (parsev3rddirres(dp, vflag))
+ return;
+ } else {
+ if (parserddires(dp) != 0)
+ return;
+ }
+ break;
+
+ case NFSPROC_READDIRPLUS:
+ printf(" readdirplus");
+ if (!(dp = parserep(rp, length)))
+ break;
+ if (parsev3rddirres(dp, vflag))
return;
break;
- case NFSPROC_MKDIR:
- printf(" mkdir");
+ case NFSPROC_FSSTAT:
+ printf(" fsstat");
dp = parserep(rp, length);
- if (dp != NULL && parsediropres(dp) != 0)
+ if (dp != 0 && parsestatfs(dp, v3) != 0)
return;
break;
- case NFSPROC_RMDIR:
- printf(" rmdir");
+ case NFSPROC_FSINFO:
+ printf(" fsinfo");
dp = parserep(rp, length);
- if (dp != NULL && parsestatus(dp) != 0)
+ if (dp != 0 && parsefsinfo(dp) != 0)
return;
break;
- case NFSPROC_READDIR:
- printf(" readdir");
+ case NFSPROC_PATHCONF:
+ printf(" pathconf");
dp = parserep(rp, length);
- if (dp != NULL && parserddires(dp) != 0)
+ if (dp != 0 && parsepathconf(dp) != 0)
return;
break;
- case NFSPROC_STATFS:
- printf(" statfs");
+ case NFSPROC_COMMIT:
+ printf(" commit");
dp = parserep(rp, length);
- if (dp != NULL && parsestatfs(dp) != 0)
+ if (dp != 0 && parsewccres(dp, vflag) != 0)
return;
break;
default:
- printf(" proc-%u", proc);
+ printf(" proc-%lu", proc);
return;
}
- if (!nfserr)
- fputs(" [|nfs]", stdout);
+
+trunc:
+ fputs(" [|nfs]", stdout);
}
diff --git a/contrib/tcpdump/print-ntp.c b/contrib/tcpdump/print-ntp.c
index 67368d0..eedca7a 100644
--- a/contrib/tcpdump/print-ntp.c
+++ b/contrib/tcpdump/print-ntp.c
@@ -24,8 +24,8 @@
*/
#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: print-ntp.c,v 1.25 96/11/05 13:30:37 leres Exp $ (LBL)";
+static char rcsid[] =
+ "@(#) $Header: print-ntp.c,v 1.23 96/07/23 14:17:26 leres Exp $ (LBL)";
#endif
#include <sys/param.h>
@@ -39,7 +39,7 @@ struct rtentry;
#include <net/if.h>
#include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <net/ethernet.h>
#include <ctype.h>
#include <stdio.h>
@@ -71,7 +71,7 @@ ntp_print(register const u_char *cp, u_int length)
TCHECK(bp->status);
- version = (int)(bp->status & VERSIONMASK) >> 3;
+ version = (bp->status & VERSIONMASK) >> 3;
printf(" v%d", version);
leapind = bp->status & LEAPMASK;
diff --git a/contrib/tcpdump/print-null.c b/contrib/tcpdump/print-null.c
index ba731d8..eaa8a26 100644
--- a/contrib/tcpdump/print-null.c
+++ b/contrib/tcpdump/print-null.c
@@ -20,8 +20,8 @@
*/
#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: print-null.c,v 1.22 96/12/10 23:18:58 leres Exp $ (LBL)";
+static char rcsid[] =
+ "@(#)$Header: print-null.c,v 1.19 96/07/14 19:39:02 leres Exp $ (LBL)";
#endif
#include <sys/param.h>
@@ -39,26 +39,22 @@ struct rtentry;
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
-#include <netinet/if_ether.h>
+#include <net/ethernet.h>
#include <netinet/ip_var.h>
#include <netinet/udp.h>
#include <netinet/udp_var.h>
#include <netinet/tcp.h>
#include <netinet/tcpip.h>
-#include <pcap.h>
#include <stdio.h>
#include <string.h>
-#include "addrtoname.h"
#include "interface.h"
+#include "addrtoname.h"
+#include "pcap.h"
#define NULL_HDRLEN 4
-#ifndef AF_NS
-#define AF_NS 6 /* XEROX NS protocols */
-#endif
-
static void
null_print(const u_char *p, const struct ip *ip, u_int length)
{
diff --git a/contrib/tcpdump/print-ppp.c b/contrib/tcpdump/print-ppp.c
index 27dee0e..50c3c2a 100644
--- a/contrib/tcpdump/print-ppp.c
+++ b/contrib/tcpdump/print-ppp.c
@@ -20,8 +20,8 @@
*/
#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: print-ppp.c,v 1.24 96/12/10 23:23:12 leres Exp $ (LBL)";
+static char rcsid[] =
+ "@(#)$Header: print-ppp.c,v 1.22 96/07/14 19:39:03 leres Exp $ (LBL)";
#endif
#ifdef PPP
@@ -47,11 +47,54 @@ struct rtentry;
#include <signal.h>
#include <stdio.h>
+#include <net/ethernet.h>
+#include "ethertype.h"
+
+#include <net/ppp_defs.h>
#include "interface.h"
#include "addrtoname.h"
-/* XXX This goes somewhere else. */
-#define PPP_HDRLEN 4
+struct protonames {
+ u_short protocol;
+ char *name;
+};
+
+static struct protonames protonames[] = {
+ /*
+ * Protocol field values.
+ */
+ PPP_IP, "IP", /* Internet Protocol */
+ PPP_XNS, "XNS", /* Xerox NS */
+ PPP_IPX, "IPX", /* IPX Datagram (RFC1552) */
+ PPP_VJC_COMP, "VJC_UNCOMP", /* VJ compressed TCP */
+ PPP_VJC_UNCOMP, "VJC_UNCOMP", /* VJ uncompressed TCP */
+ PPP_COMP, "COMP", /* compressed packet */
+ PPP_IPCP, "IPCP", /* IP Control Protocol */
+ PPP_IPXCP, "IPXCP", /* IPX Control Protocol (RFC1552) */
+ PPP_CCP, "CCP", /* Compression Control Protocol */
+ PPP_LCP, "LCP", /* Link Control Protocol */
+ PPP_PAP, "PAP", /* Password Authentication Protocol */
+ PPP_LQR, "LQR", /* Link Quality Report protocol */
+ PPP_CHAP, "CHAP", /* Cryptographic Handshake Auth. Proto*/
+};
+
+void
+ppp_hdlc_print(const u_char *p, int length)
+{
+ int proto = PPP_PROTOCOL(p);
+ int i;
+
+ printf("%4d %02x ", length, PPP_CONTROL(p));
+
+ for (i = (sizeof(protonames) / sizeof(protonames[0])) - 1; i >= 0; --i){
+ if (proto == protonames[i].protocol) {
+ printf("%s: ", protonames[i].name);
+ break;
+ }
+ }
+ if (i < 0)
+ printf("%04x: ", proto);
+}
void
ppp_if_print(u_char *user, const struct pcap_pkthdr *h,
@@ -59,7 +102,6 @@ ppp_if_print(u_char *user, const struct pcap_pkthdr *h,
{
register u_int length = h->len;
register u_int caplen = h->caplen;
- const struct ip *ip;
ts_print(&h->ts);
@@ -77,15 +119,31 @@ ppp_if_print(u_char *user, const struct pcap_pkthdr *h,
snapend = p + caplen;
if (eflag)
- printf("%c %4d %02x %04x: ", p[0] ? 'O' : 'I', length,
- p[1], ntohs(*(u_short *)&p[2]));
+ ppp_hdlc_print(p, length);
length -= PPP_HDRLEN;
- ip = (struct ip *)(p + PPP_HDRLEN);
- ip_print((const u_char *)ip, length);
+
+ switch(PPP_PROTOCOL(p)) {
+ case PPP_IP:
+ case ETHERTYPE_IP:
+ ip_print((const u_char *)(p + PPP_HDRLEN), length);
+ break;
+ case PPP_IPX:
+ case ETHERTYPE_IPX:
+ ipx_print((const u_char *)(p + PPP_HDRLEN), length);
+ break;
+
+ default:
+ if(!eflag)
+ ppp_hdlc_print(p, length);
+ if(!xflag)
+ default_print((const u_char *)(p + PPP_HDRLEN),
+ caplen - PPP_HDRLEN);
+ }
if (xflag)
- default_print((const u_char *)ip, caplen - PPP_HDRLEN);
+ default_print((const u_char *)(p + PPP_HDRLEN),
+ caplen - PPP_HDRLEN);
out:
putchar('\n');
}
diff --git a/contrib/tcpdump/print-sl.c b/contrib/tcpdump/print-sl.c
index dfea3bf..97a283b 100644
--- a/contrib/tcpdump/print-sl.c
+++ b/contrib/tcpdump/print-sl.c
@@ -20,8 +20,8 @@
*/
#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: print-sl.c,v 1.41 96/12/10 23:19:42 leres Exp $ (LBL)";
+static char rcsid[] =
+ "@(#)$Header: print-sl.c,v 1.38 96/07/15 18:23:25 leres Exp $ (LBL)";
#endif
#ifdef HAVE_NET_SLIP_H
@@ -41,7 +41,7 @@ struct rtentry;
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
-#include <netinet/if_ether.h>
+#include <net/ethernet.h>
#include <netinet/ip_var.h>
#include <netinet/udp.h>
#include <netinet/udp_var.h>
@@ -139,7 +139,7 @@ sliplink_print(register const u_char *p, register const struct ip *ip,
case TYPE_UNCOMPRESSED_TCP:
/*
- * The connection id is stored in the IP protocol field.
+ * The connection id is stored in the IP protcol field.
* Get it from the link layer since sl_uncompress_tcp()
* has restored the IP header copy to IPPROTO_TCP.
*/
@@ -243,7 +243,6 @@ compressed_sl_print(const u_char *chdr, const struct ip *ip,
#include <sys/types.h>
#include <sys/time.h>
-#include <pcap.h>
#include <stdio.h>
#include "interface.h"
diff --git a/contrib/tcpdump/print-sunrpc.c b/contrib/tcpdump/print-sunrpc.c
index 5e3f9ae..281194a 100644
--- a/contrib/tcpdump/print-sunrpc.c
+++ b/contrib/tcpdump/print-sunrpc.c
@@ -20,8 +20,8 @@
*/
#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: print-sunrpc.c,v 1.25 96/09/26 23:36:49 leres Exp $ (LBL)";
+static char rcsid[] =
+ "@(#) $Header: print-sunrpc.c,v 1.24 96/07/23 14:17:27 leres Exp $ (LBL)";
#endif
#include <sys/param.h>
@@ -35,7 +35,7 @@ struct rtentry;
#include <net/if.h>
#include <netinet/in.h>
-#include <netinet/if_ether.h>
+#include <net/ethernet.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/ip_var.h>
diff --git a/contrib/tcpdump/print-udp.c b/contrib/tcpdump/print-udp.c
index 3960de8..7ada5b2 100644
--- a/contrib/tcpdump/print-udp.c
+++ b/contrib/tcpdump/print-udp.c
@@ -20,8 +20,8 @@
*/
#ifndef lint
-static const char rcsid[] =
- "@(#) $Header: print-udp.c,v 1.58 96/12/10 23:22:07 leres Exp $ (LBL)";
+static char rcsid[] =
+ "@(#) $Header: print-udp.c,v 1.55 96/07/23 14:17:28 leres Exp $ (LBL)";
#endif
#include <sys/param.h>
@@ -48,12 +48,12 @@ static const char rcsid[] =
#include "addrtoname.h"
#include "appletalk.h"
-#include "nfsv2.h"
+#include "nfs.h"
#include "bootp.h"
struct rtcphdr {
u_short rh_flags; /* T:2 P:1 CNT:5 PT:8 */
- u_short rh_len; /* length of message (in words) */
+ u_short rh_len; /* length of message (in bytes) */
u_int rh_ssrc; /* synchronization src id */
};
@@ -77,28 +77,27 @@ struct rtcp_sr {
* Time stamps are middle 32-bits of ntp timestamp.
*/
struct rtcp_rr {
- u_int rr_srcid; /* sender being reported */
- u_int rr_nl; /* no. packets lost */
- u_int rr_ls; /* extended last seq number received */
+ u_int rr_srcid; /* sender being reported */
+ u_int rr_nr; /* no. packets received */
+ u_int rr_np; /* no. packets predicted */
u_int rr_dv; /* jitter (delay variance) */
u_int rr_lsr; /* orig. ts from last rr from this src */
u_int rr_dlsr; /* time from recpt of last rr to xmit time */
};
/*XXX*/
-#define RTCP_PT_SR 200
-#define RTCP_PT_RR 201
-#define RTCP_PT_SDES 202
+#define RTCP_PT_SR 0
+#define RTCP_PT_RR 1
+#define RTCP_PT_SDES 2
#define RTCP_SDES_CNAME 1
#define RTCP_SDES_NAME 2
#define RTCP_SDES_EMAIL 3
#define RTCP_SDES_PHONE 4
#define RTCP_SDES_LOC 5
#define RTCP_SDES_TOOL 6
-#define RTCP_SDES_NOTE 7
-#define RTCP_SDES_PRIV 8
-#define RTCP_PT_BYE 203
-#define RTCP_PT_APP 204
+#define RTCP_SDES_TXT 7
+#define RTCP_PT_BYE 3
+#define RTCP_PT_APP 4
static void
vat_print(const void *hdr, u_int len, register const struct udphdr *up)
@@ -131,26 +130,24 @@ rtp_print(const void *hdr, u_int len, register const struct udphdr *up)
{
/* rtp v1 or v2 */
u_int *ip = (u_int *)hdr;
- u_int hasopt, hasext, contype, hasmarker;
+ u_int hasopt, contype, hasmarker;
u_int i0 = ntohl(((u_int *)hdr)[0]);
u_int i1 = ntohl(((u_int *)hdr)[1]);
u_int dlen = ntohs(up->uh_ulen) - sizeof(*up) - 8;
- const char * ptype;
+ const char* ptype;
ip += 2;
len >>= 2;
len -= 2;
- hasopt = 0;
- hasext = 0;
if ((i0 >> 30) == 1) {
/* rtp v1 */
hasopt = i0 & 0x800000;
contype = (i0 >> 16) & 0x3f;
hasmarker = i0 & 0x400000;
ptype = "rtpv1";
- } else {
+ } else { /*XXX*/
/* rtp v2 */
- hasext = i0 & 0x10000000;
+ hasopt = i0 & 0x20000000;
contype = (i0 >> 16) & 0x7f;
hasmarker = i0 & 0x800000;
dlen -= 4;
@@ -158,16 +155,14 @@ rtp_print(const void *hdr, u_int len, register const struct udphdr *up)
ip += 1;
len -= 1;
}
- printf(" udp/%s %d c%d %s%s %d %u",
+ printf(" udp/%s %d c%d %s%s %d",
ptype,
dlen,
contype,
- (hasopt || hasext)? "+" : "",
+ hasopt? "+" : "",
hasmarker? "*" : "",
- i0 & 0xffff,
- i1);
+ i0 & 0xffff);
if (vflag) {
- printf(" %u", i1);
if (hasopt) {
u_int i2, optlen;
do {
@@ -178,79 +173,50 @@ rtp_print(const void *hdr, u_int len, register const struct udphdr *up)
return;
}
ip += optlen;
- len -= optlen;
} while ((int)i2 >= 0);
}
- if (hasext) {
- u_int i2, extlen;
- i2 = ip[0];
- extlen = (i2 & 0xffff) + 1;
- if (extlen > len) {
- printf(" !ext");
- return;
- }
- ip += extlen;
- }
- if (contype == 0x1f) /*XXX H.261 */
+ if (contype == 0x1f)
printf(" 0x%04x", ip[0] >> 16);
+ printf(" %u", i1);
}
}
-static const u_char *
-rtcp_print(const u_char *hdr, const u_char *ep)
+static const u_char*
+rtcp_print(const u_char *hdr)
{
/* rtp v2 control (rtcp) */
- struct rtcp_rr *rr = 0;
- struct rtcp_sr *sr;
- struct rtcphdr *rh = (struct rtcphdr *)hdr;
- u_int len;
- u_short flags;
- int cnt;
- double ts, dts;
- if ((u_char *)(rh + 1) > ep) {
- printf(" [|rtcp]");
- return (ep);
- }
- len = (ntohs(rh->rh_len) + 1) * 4;
- flags = ntohs(rh->rh_flags);
- cnt = (flags >> 8) & 0x1f;
+ struct rtcp_rr* rr = 0;
+ struct rtcp_sr* sr;
+ struct rtcphdr* rh = (struct rtcphdr*)hdr;
+ u_int len = (ntohs(rh->rh_len) + 1) * 4;
+ u_short flags = ntohs(rh->rh_flags);
+ int cnt = (flags >> 8) & 0x1f;
+ double ts, dts, jitter;
+ if (vflag)
+ printf(" %u", (u_int32_t)ntohl(rh->rh_ssrc));
switch (flags & 0xff) {
case RTCP_PT_SR:
- sr = (struct rtcp_sr *)(rh + 1);
+ sr = (struct rtcp_sr*)(rh + 1);
printf(" sr");
if (len != cnt * sizeof(*rr) + sizeof(*sr) + sizeof(*rh))
printf(" [%d]", len);
- if (vflag)
- printf(" %u", (u_int32_t)ntohl(rh->rh_ssrc));
- if ((u_char *)(sr + 1) > ep) {
- printf(" [|rtcp]");
- return (ep);
- }
- ts = (double)((u_int32_t)ntohl(sr->sr_ntp.upper)) +
- ((double)((u_int32_t)ntohl(sr->sr_ntp.lower)) /
- 4294967296.0);
- printf(" @%.2f %u %up %ub", ts, (u_int32_t)ntohl(sr->sr_ts),
- (u_int32_t)ntohl(sr->sr_np), (u_int32_t)ntohl(sr->sr_nb));
- rr = (struct rtcp_rr *)(sr + 1);
+ ts = (double)((u_int32_t)ntohl(sr->sr_ts)) / 65536.;
+ printf(" @%.2f %up %ub", ts, (u_int32_t)ntohl(sr->sr_np),
+ (u_int32_t)ntohl(sr->sr_nb));
+ rr = (struct rtcp_rr*)(sr + 1);
break;
case RTCP_PT_RR:
printf(" rr");
if (len != cnt * sizeof(*rr) + sizeof(*rh))
printf(" [%d]", len);
- rr = (struct rtcp_rr *)(rh + 1);
- if (vflag)
- printf(" %u", (u_int32_t)ntohl(rh->rh_ssrc));
+ rr = (struct rtcp_rr*)(rh + 1);
break;
case RTCP_PT_SDES:
printf(" sdes %d", len);
- if (vflag)
- printf(" %u", (u_int32_t)ntohl(rh->rh_ssrc));
cnt = 0;
break;
case RTCP_PT_BYE:
printf(" bye %d", len);
- if (vflag)
- printf(" %u", (u_int32_t)ntohl(rh->rh_ssrc));
cnt = 0;
break;
default:
@@ -261,18 +227,19 @@ rtcp_print(const u_char *hdr, const u_char *ep)
if (cnt > 1)
printf(" c%d", cnt);
while (--cnt >= 0) {
- if ((u_char *)(rr + 1) > ep) {
+ if ((u_char*)(rr + 1) > snapend) {
printf(" [|rtcp]");
- return (ep);
+ return (snapend);
}
if (vflag)
printf(" %u", (u_int32_t)ntohl(rr->rr_srcid));
ts = (double)((u_int32_t)ntohl(rr->rr_lsr)) / 65536.;
dts = (double)((u_int32_t)ntohl(rr->rr_dlsr)) / 65536.;
- printf(" %ul %us %uj @%.2f+%.2f",
- (u_int32_t)ntohl(rr->rr_nl) & 0x00ffffff,
- (u_int32_t)ntohl(rr->rr_ls),
- (u_int32_t)ntohl(rr->rr_dv), ts, dts);
+ jitter = (double)((u_int32_t)ntohl(rr->rr_dv)) / 65536.;
+ printf(" %ur %ue %.2fj @%.2f+%.2f",
+ (u_int32_t)ntohl(rr->rr_nr),
+ (u_int32_t)ntohl(rr->rr_np),
+ jitter, ts, dts);
}
return (hdr + len);
}
@@ -293,11 +260,8 @@ udp_print(register const u_char *bp, u_int length, register const u_char *bp2)
register const struct udphdr *up;
register const struct ip *ip;
register const u_char *cp;
- register const u_char *ep = bp + length;
u_short sport, dport, ulen;
- if (ep > snapend)
- ep = snapend;
up = (struct udphdr *)bp;
ip = (struct ip *)bp2;
cp = (u_char *)(up + 1);
@@ -364,44 +328,43 @@ udp_print(register const u_char *bp, u_int length, register const u_char *bp2)
udpport_string(sport),
ipaddr_string(&ip->ip_dst),
udpport_string(dport));
- while (cp < ep)
- cp = rtcp_print(cp, ep);
+ while (cp < snapend)
+ cp = rtcp_print(cp);
break;
}
return;
}
- if (!qflag) {
+ if (! qflag) {
register struct rpc_msg *rp;
enum msg_type direction;
rp = (struct rpc_msg *)(up + 1);
- if (TTEST(rp->rm_direction)) {
- direction = (enum msg_type)ntohl(rp->rm_direction);
- if (dport == NFS_PORT && direction == CALL) {
- nfsreq_print((u_char *)rp, length,
- (u_char *)ip);
- return;
- }
- if (sport == NFS_PORT && direction == REPLY) {
- nfsreply_print((u_char *)rp, length,
- (u_char *)ip);
- return;
- }
+ TCHECK(rp->rm_direction);
+ direction = (enum msg_type)ntohl(rp->rm_direction);
+ if (dport == NFS_PORT && direction == CALL) {
+ nfsreq_print((u_char *)rp, length, (u_char *)ip);
+ return;
+ }
+ else if (sport == NFS_PORT && direction == REPLY) {
+ nfsreply_print((u_char *)rp, length, (u_char *)ip);
+ return;
+ }
#ifdef notdef
- if (dport == SUNRPC_PORT && direction == CALL) {
- sunrpcrequest_print((u_char *)rp, length, (u_char *)ip);
+ else if (dport == SUNRPC_PORT && direction == CALL) {
+ sunrpcrequest_print((u_char *)rp, length, (u_char *)ip);
+ return;
+ }
+#endif
+ else {
+ TCHECK2(cp[0], 1);
+ if (((struct LAP *)cp)->type == lapDDP &&
+ (atalk_port(sport) || atalk_port(dport))) {
+ if (vflag)
+ fputs("kip ", stdout);
+ atalk_print(cp, length);
return;
}
-#endif
- }
- if (TTEST(((struct LAP *)cp)->type) &&
- ((struct LAP *)cp)->type == lapDDP &&
- (atalk_port(sport) || atalk_port(dport))) {
- if (vflag)
- fputs("kip ", stdout);
- atalk_print(cp, length);
- return;
}
}
(void)printf("%s.%s > %s.%s:",
@@ -438,4 +401,7 @@ udp_print(register const u_char *bp, u_int length, register const u_char *bp2)
#undef ISPORT
} else
(void)printf(" udp %u", (u_int32_t)(ulen - sizeof(*up)));
+ return;
+trunc:
+ fputs("[|udp]", stdout);
}
diff --git a/contrib/tcpdump/tcpdump.1 b/contrib/tcpdump/tcpdump.1
index 68757a4..cbe8839 100644
--- a/contrib/tcpdump/tcpdump.1
+++ b/contrib/tcpdump/tcpdump.1
@@ -1,4 +1,4 @@
-.\" @(#) $Header: tcpdump.1,v 1.65 96/11/29 01:03:01 leres Exp $ (LBL)
+.\" @(#) $Header: tcpdump.1,v 1.61 96/07/14 19:45:00 leres Exp $ (LBL)
.\"
.\" Copyright (c) 1987, 1988, 1989, 1990, 1991, 1992, 1994, 1995, 1996
.\" The Regents of the University of California. All rights reserved.
@@ -20,7 +20,7 @@
.\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
.\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
.\"
-.TH TCPDUMP 1 "29 November 1996"
+.TH TCPDUMP 1 "14 July 1996"
.SH NAME
tcpdump \- dump traffic on a network
.SH SYNOPSIS
@@ -67,7 +67,6 @@ tcpdump \- dump traffic on a network
.LP
\fITcpdump\fP prints out the headers of packets on a network interface
that match the boolean \fIexpression\fP.
-.LP
.B Under SunOS with nit or bpf:
To run
.I tcpdump
@@ -82,10 +81,9 @@ You must have read access to the network pseudo device, e.g.
You must be root or it must be installed setuid to root.
.B Under IRIX with snoop:
You must be root or it must be installed setuid to root.
-.B Under Linux:
-You must be root or it must be installed setuid to root.
-.B Under Ultrix and Digital UNIX:
-Once the super-user has enabled promiscuous-mode operation using
+.B Under Ultrix:
+Once the super-user has enabled
+promiscuous-mode operation using
.IR pfconfig (8),
any user may run
.BR tcpdump .
@@ -267,6 +265,9 @@ protos are:
.BR sca ,
.BR moprc ,
.BR mopdl ,
+.BR iso ,
+.BR esis ,
+.BR isis ,
.B tcp
and
.BR udp .
@@ -447,7 +448,7 @@ True if the DECNET destination address is
.IP "\fBdecnet host \fIhost\fR"
True if either the DECNET source or destination address is
.IR host .
-.IP "\fBip\fR, \fBarp\fR, \fBrarp\fR, \fBdecnet\fR"
+.IP "\fBip\fR, \fBarp\fR, \fBrarp\fR, \fBdecnet\fR, \fBiso\fR"
Abbreviations for:
.in +.5i
.nf
@@ -473,6 +474,15 @@ Abbreviations for:
.fi
.in -.5i
where \fIp\fR is one of the above protocols.
+.IP "\fBesis\fR, \fBisis\fR"
+Abbreviations for:
+.in +.5i
+.nf
+\fBiso proto \fIp\fR
+.fi
+.in -.5i
+where \fIp\fR is one of the above protocols.
+Note that \fItcpdump\fR does an incomplete job of parsing these protocols.
.IP "\fIexpr relop expr\fR"
True if the relation holds, where \fIrelop\fR is one of >, <, >=, <=, =, !=,
and \fIexpr\fR is an arithmetic expression composed of integer constants
@@ -815,16 +825,6 @@ socket buffer since csam's receive window has gotten 19 bytes smaller.
Csam also sends one byte of data to rtsg in this packet.
On the 8th and 9th lines,
csam sends two bytes of urgent, pushed data to rtsg.
-.LP
-If the snapshot was small enough that \fBtcpdump\fP didn't capture
-the full TCP header, it interprets as much of the header as it can
-and then reports ``[|\fItcp\fP]'' to indicate the remainder could not
-be interpreted. If the header contains a bogus option (one with a length
-that's either too small or beyond the end of the header), tcpdump reports
-it as ``[\fIbad opt\fP]'' and does not interpret any further options (since
-it's impossible to tell where they start). If the header length indicates
-options are present but the IP datagram length is not long enough for the
-options to actually be there, tcpdump reports it as ``[\fIbad hdr length\fP]''.
.HD
.B
UDP Packets
@@ -1177,22 +1177,33 @@ serviced the `new packet' interrupt.
.SH "SEE ALSO"
traffic(1C), nit(4P), bpf(4), pcap(3)
.SH AUTHORS
-Van Jacobson,
-Craig Leres and
-Steven McCanne, all of the
-Lawrence Berkeley National Laboratory, University of California, Berkeley, CA.
-.LP
-The current version is available via anonymous ftp:
-.LP
-.RS
-.I ftp://ftp.ee.lbl.gov/tcpdump.tar.Z
-.RE
+Van Jacobson (van@ee.lbl.gov),
+Craig Leres (leres@ee.lbl.gov) and
+Steven McCanne (mccanne@ee.lbl.gov), all of the
+Lawrence Berkeley Laboratory, University of California, Berkeley, CA.
.SH BUGS
-Please send bug reports to tcpdump@ee.lbl.gov.
+Please send bug reports to tcpdump@ee.lbl.gov or libpcap@ee.lbl.gov.
.LP
NIT doesn't let you watch your own outbound traffic, BPF will.
We recommend that you use the latter.
.LP
+\fItcpdump\fP for Ultrix requires Ultrix version 4.0 or later; the kernel
+has to have been built with the \fIpacketfilter\fP pseudo-device driver
+(see
+.IR packetfilter (4)).
+In order to watch either your own outbound or inbound traffic,
+you will need to use Ultrix version 4.2 or later, and you will have
+to have used the
+.IR pfconfig (8)
+command to enable ``copyall'' mode.
+.LP
+Under SunOS 4.1, the packet capture code (or Streams NIT) is not what
+you'd call efficient. Don't plan on doing much with your Sun while
+you're monitoring a busy network.
+.LP
+On Sun systems prior to release 3.2, NIT is very buggy.
+If run on an old system, tcpdump may crash the machine.
+.LP
Some attempt should be made to reassemble IP fragments or, at least
to compute the right length for the higher level protocol.
.LP
OpenPOWER on IntegriCloud