Simplify tcpdump

classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

Simplify tcpdump

Michael McConville-3
fddi_bitswap is only used once, and it just adds a layer of indirection
to its preprocessor condition.

This also removes macros for BSDi and Ultrix.

ok?


Index: print-fddi.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/print-fddi.c,v
retrieving revision 1.17
diff -u -p -r1.17 print-fddi.c
--- print-fddi.c 16 Nov 2015 00:16:39 -0000 1.17
+++ print-fddi.c 26 Jan 2016 03:47:55 -0000
@@ -48,16 +48,6 @@ struct rtentry;
 #include "fddi.h"
 
 /*
- * Some FDDI interfaces use bit-swapped addresses.
- */
-#if defined(ultrix) || defined(__alpha) || defined(__bsdi) || \
- defined(__NetBSD__) || defined(__OpenBSD__)
-int fddi_bitswap = 0;
-#else
-int fddi_bitswap = 1;
-#endif
-
-/*
  * FDDI support for tcpdump, by Jeffrey Mogul [DECWRL], June 1992
  *
  * Based in part on code by Van Jacobson, which bears this note:
@@ -200,20 +190,22 @@ extract_fddi_addrs(const struct fddi_hea
 {
  int i;
 
- if (fddi_bitswap) {
- /*
- * bit-swap the fddi addresses (isn't the IEEE standards
- * process wonderful!) then convert them to names.
- */
- for (i = 0; i < 6; ++i)
- fdst[i] = fddi_bit_swap[fddip->fddi_dhost[i]];
- for (i = 0; i < 6; ++i)
- fsrc[i] = fddi_bit_swap[fddip->fddi_shost[i]];
- }
- else {
- memcpy(fdst, (char *)fddip->fddi_dhost, 6);
- memcpy(fsrc, (char *)fddip->fddi_shost, 6);
- }
+ /*
+ * Some FDDI interfaces use bit-swapped addresses.
+ */
+#if defined(__alpha) || defined(__NetBSD__) || defined(__OpenBSD__)
+ memcpy(fdst, (char *)fddip->fddi_dhost, 6);
+ memcpy(fsrc, (char *)fddip->fddi_shost, 6);
+#else
+ /*
+ * bit-swap the fddi addresses (isn't the IEEE standards
+ * process wonderful!) then convert them to names.
+ */
+ for (i = 0; i < 6; ++i)
+ fdst[i] = fddi_bit_swap[fddip->fddi_dhost[i]];
+ for (i = 0; i < 6; ++i)
+ fsrc[i] = fddi_bit_swap[fddip->fddi_shost[i]];
+#endif
 }
 
 /*

Reply | Threaded
Open this post in threaded view
|

Re: Simplify tcpdump

Stuart Henderson-6
On 2016/01/25 22:52, Michael McConville wrote:
> fddi_bitswap is only used once, and it just adds a layer of indirection
> to its preprocessor condition.

Oh yuk. This is bogus anyway, and there's no good way to handle it.
We dropped support for FDDI interfaces so it only affect decodes of
pcap files, and who knows where they were created?

> +#if defined(__alpha) || defined(__NetBSD__) || defined(__OpenBSD__)
> + memcpy(fdst, (char *)fddip->fddi_dhost, 6);
> + memcpy(fsrc, (char *)fddip->fddi_shost, 6);
> +#else
> + /*
> + * bit-swap the fddi addresses (isn't the IEEE standards
> + * process wonderful!) then convert them to names.
> + */
> + for (i = 0; i < 6; ++i)
> + fdst[i] = fddi_bit_swap[fddip->fddi_dhost[i]];
> + for (i = 0; i < 6; ++i)
> + fsrc[i] = fddi_bit_swap[fddip->fddi_shost[i]];
> +#endif
>  }
>  
>  /*
>

#if 1
        ...
#else
        /* You might need this depending on where the pcap file was created */
        ...
#endif

? *shrug*

Reply | Threaded
Open this post in threaded view
|

Re: Simplify tcpdump

Michael McConville-3
Stuart Henderson wrote:
> On 2016/01/25 22:52, Michael McConville wrote:
> > fddi_bitswap is only used once, and it just adds a layer of
> > indirection to its preprocessor condition.
>
> Oh yuk. This is bogus anyway, and there's no good way to handle it. We
> dropped support for FDDI interfaces so it only affect decodes of pcap
> files, and who knows where they were created?

I'm not familiar with FDDI and I'm new to tcpdump, so I can't offer much
input. How much do you think can/should be removed?

Reply | Threaded
Open this post in threaded view
|

Re: Simplify tcpdump

Stuart Henderson-6
On 2016/01/26 20:16, Michael McConville wrote:

> Stuart Henderson wrote:
> > On 2016/01/25 22:52, Michael McConville wrote:
> > > fddi_bitswap is only used once, and it just adds a layer of
> > > indirection to its preprocessor condition.
> >
> > Oh yuk. This is bogus anyway, and there's no good way to handle it. We
> > dropped support for FDDI interfaces so it only affect decodes of pcap
> > files, and who knows where they were created?
>
> I'm not familiar with FDDI and I'm new to tcpdump, so I can't offer much
> input. How much do you think can/should be removed?

FDDI is a dual token-ring network based on 100Mb fibre connections,
often over larger distances (campus/metro) than a typical lan. It's
obsolete, we removed support for the adapters, the only place this
code could possibly be used now is for parsing pcap files captured
on another system or from older OpenBSD (and there's a kitchen-sink
pcap decoder in ports these days..).

This bitswap thing is because some OS bitswap the network addresses
(in the driver or somewhere; they are swapped in pcap files) and some
don't.

I don't think that it's particularly useful for OpenBSD to support
decoding this any more. Maybe we should stop rearranging these
deckchairs and borrow tedu's axe instead.

Reply | Threaded
Open this post in threaded view
|

Re: Simplify tcpdump

Michael McConville-3
Stuart Henderson wrote:

> On 2016/01/26 20:16, Michael McConville wrote:
> > Stuart Henderson wrote:
> > > On 2016/01/25 22:52, Michael McConville wrote:
> > > > fddi_bitswap is only used once, and it just adds a layer of
> > > > indirection to its preprocessor condition.
> > >
> > > Oh yuk. This is bogus anyway, and there's no good way to handle it. We
> > > dropped support for FDDI interfaces so it only affect decodes of pcap
> > > files, and who knows where they were created?
> >
> > I'm not familiar with FDDI and I'm new to tcpdump, so I can't offer much
> > input. How much do you think can/should be removed?
>
> FDDI is a dual token-ring network based on 100Mb fibre connections,
> often over larger distances (campus/metro) than a typical lan. It's
> obsolete, we removed support for the adapters, the only place this
> code could possibly be used now is for parsing pcap files captured
> on another system or from older OpenBSD (and there's a kitchen-sink
> pcap decoder in ports these days..).
>
> This bitswap thing is because some OS bitswap the network addresses
> (in the driver or somewhere; they are swapped in pcap files) and some
> don't.
>
> I don't think that it's particularly useful for OpenBSD to support
> decoding this any more. Maybe we should stop rearranging these
> deckchairs and borrow tedu's axe instead.

Something like this? There's a lot to be removed from libpcap too.


Index: INSTALL
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/INSTALL,v
retrieving revision 1.6
diff -u -p -r1.6 INSTALL
--- INSTALL 5 Dec 2015 21:43:51 -0000 1.6
+++ INSTALL 27 Jan 2016 01:49:10 -0000
@@ -15,7 +15,6 @@ bpf_dump.c - bpf instruction pretty-prin
 decnet.h - DECnet definitions
 ethertype.h - ethernet definitions
 extract.h - alignment definitions
-fddi.h - Fiber Distributed Data Interface definitions
 gmt2local.c - time conversion routines
 gmt2local.h - time conversion prototypes
 igrp.h - Interior Gateway Routing Protocol definitions
@@ -43,7 +42,6 @@ print-decnet.c - DECnet printer routines
 print-domain.c - Domain Name System printer routines
 print-enc.c - Encapsulated printer routines
 print-ether.c - ethernet printer routines
-print-fddi.c - Fiber Distributed Data Interface printer routines
 print-gre.c - Generic Routing Encapsulation printer routines
 print-icmp.c - Internet Control Message Protocol printer routines
 print-igrp.c - Interior Gateway Routing Protocol printer routines
Index: Makefile
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/Makefile,v
retrieving revision 1.59
diff -u -p -r1.59 Makefile
--- Makefile 14 Oct 2015 04:55:17 -0000 1.59
+++ Makefile 27 Jan 2016 01:49:10 -0000
@@ -28,7 +28,7 @@ CFLAGS+=-Wall -I${.CURDIR}/../../sbin/pf
 # for pcap-int.h
 CFLAGS+=-I${.CURDIR}/../../lib/libpcap
 
-CFLAGS+=-DCSLIP -DPPP -DHAVE_FDDI -DETHER_SERVICE -DHAVE_NET_SLIP_H -DHAVE_ETHER_NTOHOST -DINET6
+CFLAGS+=-DCSLIP -DPPP -DETHER_SERVICE -DHAVE_NET_SLIP_H -DHAVE_ETHER_NTOHOST -DINET6
 
 LDADD+= -lpcap -ll -lcrypto
 DPADD+= ${LIBL} ${LIBPCAP} ${LIBCRYPTO}
@@ -38,7 +38,7 @@ SRCS= tcpdump.c addrtoname.c privsep.c p
  print-atalk.c print-domain.c print-tftp.c print-bootp.c print-nfs.c \
  print-icmp.c print-sl.c print-ppp.c print-rip.c print-timed.c \
  print-snmp.c print-ntp.c print-null.c print-ospf.c print-gtp.c \
- print-fddi.c print-llc.c print-sunrpc.c print-hsrp.c print-vqp.c \
+ print-llc.c print-sunrpc.c print-hsrp.c print-vqp.c \
  print-vrrp.c print-wb.c print-decnet.c print-isoclns.c print-ipx.c \
  print-atm.c print-dvmrp.c print-krb.c print-pim.c print-netbios.c \
  util.c bpf_dump.c parsenfsfh.c version.c print-igrp.c \
Index: fddi.h
===================================================================
RCS file: fddi.h
diff -N fddi.h
--- fddi.h 7 Oct 2007 16:41:05 -0000 1.7
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,71 +0,0 @@
-/* $OpenBSD: fddi.h,v 1.7 2007/10/07 16:41:05 deraadt Exp $ */
-
-/*
- * Copyright (c) 1992, 1993, 1994, 1995, 1996
- * The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that: (1) source code distributions
- * retain the above copyright notice and this paragraph in its entirety, (2)
- * distributions including binary code include the above copyright notice and
- * this paragraph in its entirety in the documentation or other materials
- * provided with the distribution, and (3) all advertising materials mentioning
- * features or use of this software display the following acknowledgement:
- * ``This product includes software developed by the University of California,
- * Lawrence Berkeley Laboratory and its contributors.'' 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 ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- *
- * @(#) $Id: fddi.h,v 1.7 2007/10/07 16:41:05 deraadt Exp $ (LBL)
- */
-
-/*
- * Based on Ultrix if_fddi.h
- */
-
-/*
- * This stuff should come from a system header file, but there's no
- * obviously portable way to do that and it's not really going
- * to change from system to system (except for the padding business).
- */
-
-struct fddi_header {
- u_char  fddi_fc; /* frame control */
- u_char  fddi_dhost[6];
- u_char  fddi_shost[6];
-};
-
-
-/* Useful values for fddi_fc (frame control) field */
-
-/*
- * FDDI Frame Control bits
- */
-#define FDDIFC_C 0x80 /* Class bit */
-#define FDDIFC_L 0x40 /* Address length bit */
-#define FDDIFC_F 0x30 /* Frame format bits */
-#define FDDIFC_Z 0x0f /* Control bits */
-
-/*
- * FDDI Frame Control values. (48-bit addressing only).
- */
-#define FDDIFC_VOID 0x40 /* Void frame */
-#define FDDIFC_NRT 0x80 /* Nonrestricted token */
-#define FDDIFC_RT 0xc0 /* Restricted token */
-#define FDDIFC_SMT_INFO 0x41 /* SMT Info */
-#define FDDIFC_SMT_NSA 0x4F /* SMT Next station adrs */
-#define FDDIFC_MAC_BEACON 0xc2 /* MAC Beacon frame */
-#define FDDIFC_MAC_CLAIM 0xc3 /* MAC Claim frame */
-#define FDDIFC_LLC_ASYNC 0x50 /* Async. LLC frame */
-#define FDDIFC_LLC_SYNC 0xd0 /* Sync. LLC frame */
-#define FDDIFC_IMP_ASYNC 0x60 /* Implementor Async. */
-#define FDDIFC_IMP_SYNC 0xe0 /* Implementor Synch. */
-#define FDDIFC_SMT 0x40 /* SMT frame */
-#define FDDIFC_MAC 0xc0 /* MAC frame */
-
-#define FDDIFC_CLFF 0xF0 /* Class/Length/Format bits */
-#define FDDIFC_ZZZZ 0x0F /* Control bits */
Index: interface.h
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/interface.h,v
retrieving revision 1.66
diff -u -p -r1.66 interface.h
--- interface.h 15 Nov 2015 20:35:36 -0000 1.66
+++ interface.h 27 Jan 2016 01:49:10 -0000
@@ -205,7 +205,6 @@ extern void pfsync_if_print(u_char *, co
 extern void pfsync_ip_print(const u_char *, u_int, const u_char *);
 extern void ether_if_print(u_char *, const struct pcap_pkthdr *,
  const u_char *);
-extern void fddi_if_print(u_char *, const struct pcap_pkthdr *, const u_char *);
 extern void ppp_ether_if_print(u_char *, const struct pcap_pkthdr *,
  const u_char *);
 extern void gre_print(const u_char *, u_int);
Index: print-fddi.c
===================================================================
RCS file: print-fddi.c
diff -N print-fddi.c
--- print-fddi.c 16 Nov 2015 00:16:39 -0000 1.17
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,347 +0,0 @@
-/* $OpenBSD: print-fddi.c,v 1.17 2015/11/16 00:16:39 mmcc Exp $ */
-
-/*
- * Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996, 1997
- * The Regents of the University of California.  All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that: (1) source code distributions
- * retain the above copyright notice and this paragraph in its entirety, (2)
- * distributions including binary code include the above copyright notice and
- * this paragraph in its entirety in the documentation or other materials
- * provided with the distribution, and (3) all advertising materials mentioning
- * features or use of this software display the following acknowledgement:
- * ``This product includes software developed by the University of California,
- * Lawrence Berkeley Laboratory and its contributors.'' 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 ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
- * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-#ifdef HAVE_FDDI
-#include <sys/time.h>
-#include <sys/socket.h>
-#include <sys/file.h>
-#include <sys/ioctl.h>
-
-struct mbuf;
-struct rtentry;
-#include <net/if.h>
-
-#include <netinet/in.h>
-#include <netinet/if_ether.h>
-#include <netinet/ip.h>
-
-#include <ctype.h>
-#include <netdb.h>
-#include <pcap.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "interface.h"
-#include "addrtoname.h"
-#include "ethertype.h"
-
-#include "fddi.h"
-
-/*
- * Some FDDI interfaces use bit-swapped addresses.
- */
-#if defined(ultrix) || defined(__alpha) || defined(__bsdi) || \
- defined(__NetBSD__) || defined(__OpenBSD__)
-int fddi_bitswap = 0;
-#else
-int fddi_bitswap = 1;
-#endif
-
-/*
- * FDDI support for tcpdump, by Jeffrey Mogul [DECWRL], June 1992
- *
- * Based in part on code by Van Jacobson, which bears this note:
- *
- * NOTE:  This is a very preliminary hack for FDDI support.
- * There are all sorts of wired in constants & nothing (yet)
- * to print SMT packets as anything other than hex dumps.
- * Most of the necessary changes are waiting on my redoing
- * the "header" that a kernel fddi driver supplies to bpf:  I
- * want it to look like one byte of 'direction' (0 or 1
- * depending on whether the packet was inbound or outbound),
- * two bytes of system/driver dependent data (anything an
- * implementor thinks would be useful to filter on and/or
- * save per-packet, then the real 21-byte FDDI header.
- * Steve McCanne & I have also talked about adding the
- * 'direction' byte to all bpf headers (e.g., in the two
- * bytes of padding on an ethernet header).  It's not clear
- * we could do this in a backwards compatible way & we hate
- * the idea of an incompatible bpf change.  Discussions are
- * proceeding.
- *
- * Also, to really support FDDI (and better support 802.2
- * over ethernet) we really need to re-think the rather simple
- * minded assumptions about fixed length & fixed format link
- * level headers made in gencode.c.  One day...
- *
- *  - vj
- */
-
-#define FDDI_HDRLEN (sizeof(struct fddi_header))
-
-static u_char fddi_bit_swap[] = {
- 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
- 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
- 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
- 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
- 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
- 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
- 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
- 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
- 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
- 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
- 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
- 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
- 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
- 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
- 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
- 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
- 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
- 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
- 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
- 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
- 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
- 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
- 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
- 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
- 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
- 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
- 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
- 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
- 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
- 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
- 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
- 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
-};
-
-/*
- * Print FDDI frame-control bits
- */
-static inline void
-print_fddi_fc(u_char fc)
-{
- switch (fc) {
-
- case FDDIFC_VOID:                         /* Void frame */
- printf("void ");
- break;
-
- case FDDIFC_NRT:                          /* Nonrestricted token */
- printf("nrt ");
- break;
-
- case FDDIFC_RT:                           /* Restricted token */
- printf("rt ");
- break;
-
- case FDDIFC_SMT_INFO:                     /* SMT Info */
- printf("info ");
- break;
-
- case FDDIFC_SMT_NSA:                      /* SMT Next station adrs */
- printf("nsa ");
- break;
-
- case FDDIFC_MAC_BEACON:                   /* MAC Beacon frame */
- printf("beacon ");
- break;
-
- case FDDIFC_MAC_CLAIM:                    /* MAC Claim frame */
- printf("claim ");
- break;
-
- default:
- switch (fc & FDDIFC_CLFF) {
-
- case FDDIFC_MAC:
- printf("mac%1x ", fc & FDDIFC_ZZZZ);
- break;
-
- case FDDIFC_SMT:
- printf("smt%1x ", fc & FDDIFC_ZZZZ);
- break;
-
- case FDDIFC_LLC_ASYNC:
- printf("async%1x ", fc & FDDIFC_ZZZZ);
- break;
-
- case FDDIFC_LLC_SYNC:
- printf("sync%1x ", fc & FDDIFC_ZZZZ);
- break;
-
- case FDDIFC_IMP_ASYNC:
- printf("imp_async%1x ", fc & FDDIFC_ZZZZ);
- break;
-
- case FDDIFC_IMP_SYNC:
- printf("imp_sync%1x ", fc & FDDIFC_ZZZZ);
- break;
-
- default:
- printf("%02x ", fc);
- break;
- }
- }
-}
-
-/* Extract src, dst addresses */
-static inline void
-extract_fddi_addrs(const struct fddi_header *fddip, char *fsrc, char *fdst)
-{
- int i;
-
- if (fddi_bitswap) {
- /*
- * bit-swap the fddi addresses (isn't the IEEE standards
- * process wonderful!) then convert them to names.
- */
- for (i = 0; i < 6; ++i)
- fdst[i] = fddi_bit_swap[fddip->fddi_dhost[i]];
- for (i = 0; i < 6; ++i)
- fsrc[i] = fddi_bit_swap[fddip->fddi_shost[i]];
- }
- else {
- memcpy(fdst, (char *)fddip->fddi_dhost, 6);
- memcpy(fsrc, (char *)fddip->fddi_shost, 6);
- }
-}
-
-/*
- * Print the FDDI MAC header
- */
-static inline void
-fddi_print(const struct fddi_header *fddip, u_int length,
-   const u_char *fsrc, const u_char *fdst)
-{
- char *srcname, *dstname;
-
- srcname = etheraddr_string(fsrc);
- dstname = etheraddr_string(fdst);
-
- if (vflag)
- (void) printf("%02x %s %s %d: ",
-       fddip->fddi_fc,
-       srcname, dstname,
-       length);
- else if (qflag)
- printf("%s %s %d: ", srcname, dstname, length);
- else {
- (void) print_fddi_fc(fddip->fddi_fc);
- (void) printf("%s %s %d: ", srcname, dstname, length);
- }
-}
-
-static inline void
-fddi_smt_print(const u_char *p, u_int length)
-{
- printf("<SMT printer not yet implemented>");
-}
-
-/*
- * This is the top level routine of the printer.  'sp' is the points
- * to the FDDI header of the packet, 'tvp' is the timestamp,
- * 'length' is the length of the packet off the wire, and 'caplen'
- * is the number of bytes actually captured.
- */
-void
-fddi_if_print(u_char *pcap, const struct pcap_pkthdr *h,
-      const u_char *p)
-{
- u_int caplen = h->caplen;
- u_int length = h->len;
- u_short extracted_ethertype;
- const struct fddi_header *fddip = (struct fddi_header *)p;
- struct ether_header ehdr;
-
- ts_print(&h->ts);
-
- if (caplen < FDDI_HDRLEN) {
- printf("[|fddi]");
- goto out;
- }
- /*
- * Get the FDDI addresses into a canonical form
- */
- 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.
- * Rather than pass them all the way down, we set these globals.
- */
- snapend = p + caplen;
- /*
- * Actually, the only printer that uses packetp is print-bootp.c,
- * and it assumes that packetp points to an Ethernet header.  The
- * right thing to do is to fix print-bootp.c to know which link
- * type is in use when it excavates. XXX
- */
- packetp = (u_char *)&ehdr;
-
- if (eflag)
- fddi_print(fddip, length, ESRC(&ehdr), EDST(&ehdr));
-
- /* Skip over FDDI MAC header */
- length -= FDDI_HDRLEN;
- p += FDDI_HDRLEN;
- caplen -= FDDI_HDRLEN;
-
- /* Frame Control field determines interpretation of packet */
- extracted_ethertype = 0;
- if ((fddip->fddi_fc & FDDIFC_CLFF) == FDDIFC_LLC_ASYNC) {
- /* Try to print the LLC-layer header & higher layers */
- if (llc_print(p, length, caplen, ESRC(&ehdr), EDST(&ehdr))
-    == 0) {
- /*
- * Some kinds of LLC packet we cannot
- * handle intelligently
- */
- if (!eflag)
- fddi_print(fddip, length,
-    ESRC(&ehdr), EDST(&ehdr));
- if (extracted_ethertype) {
- printf("(LLC %s) ",
- etherproto_string(htons(extracted_ethertype)));
- }
- if (!xflag && !qflag)
- default_print(p, caplen);
- }
- } else if ((fddip->fddi_fc & FDDIFC_CLFF) == FDDIFC_SMT)
- fddi_smt_print(p, caplen);
- else {
- /* Some kinds of FDDI packet we cannot handle intelligently */
- if (!eflag)
- fddi_print(fddip, length, ESRC(&ehdr), EDST(&ehdr));
- if (!xflag && !qflag)
- default_print(p, caplen);
- }
- if (xflag)
- default_print(p, caplen);
-out:
- putchar('\n');
-}
-#else
-#include <sys/types.h>
-#include <sys/time.h>
-
-#include <stdio.h>
-
-#include "interface.h"
-void
-fddi_if_print(u_char *pcap, const struct pcap_pkthdr *h,
-      const u_char *p)
-{
-
- error("not configured for fddi");
- /* NOTREACHED */
-}
-#endif
Index: privsep_pcap.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/privsep_pcap.c,v
retrieving revision 1.19
diff -u -p -r1.19 privsep_pcap.c
--- privsep_pcap.c 1 Oct 2015 13:18:40 -0000 1.19
+++ privsep_pcap.c 27 Jan 2016 01:49:10 -0000
@@ -421,9 +421,6 @@ priv_pcap_offline(const char *fname, cha
  break;
 
  case DLT_FDDI:
- linklen = 13 + 8; /* fddi_header + llc */
- break;
-
  case DLT_NULL:
  default:
  linklen = 0;
@@ -440,11 +437,7 @@ priv_pcap_offline(const char *fname, cha
  p->buffer = p->sf.base + BPF_ALIGNMENT - (linklen % BPF_ALIGNMENT);
  p->sf.version_major = hdr.version_major;
  p->sf.version_minor = hdr.version_minor;
-#ifdef PCAP_FDDIPAD
- /* XXX what to do with this? */
- /* XXX padding only needed for kernel fcode */
- pcap_fddipad = 0;
-#endif
+
  return (p);
 
  bad:
Index: tcpdump.8
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/tcpdump.8,v
retrieving revision 1.88
diff -u -p -r1.88 tcpdump.8
--- tcpdump.8 5 Nov 2015 09:56:21 -0000 1.88
+++ tcpdump.8 27 Jan 2016 01:49:10 -0000
@@ -371,7 +371,6 @@ Possible protocols are:
 .Cm decnet ,
 .Cm esp ,
 .Cm ether ,
-.Cm fddi ,
 .Cm icmp ,
 .Cm icmp6 ,
 .Cm igmp ,
@@ -418,23 +417,6 @@ means
 port 53
 .Dc .
 .Pp
-.Cm fddi
-is actually an alias for
-.Cm ether ;
-the parser treats them identically as meaning
-.Qo
-the data link level used on the specified network interface
-.Qc .
-FDDI
-.Pq Fiber Distributed Data Interface
-headers contain Ethernet-like source and destination addresses,
-and often contain Ethernet-like packet types,
-so you can filter on these FDDI fields just as with the analogous
-Ethernet fields.
-FDDI headers also contain other fields,
-but you cannot name them explicitly in a filter expression.
-.El
-.Pp
 In addition to the above, there are some special primitive
 keywords that don't follow the pattern:
 .Cm gateway ,
@@ -662,14 +644,6 @@ or
 These identifiers are also keywords and must be escaped
 using a backslash character
 .Pq Sq \e .
-In the case of FDDI (e.g.,
-.Dq Cm fddi protocol arp ) ,
-the protocol identification comes from the 802.2 Logical Link Control
-.Pq LLC
-header, which is usually layered on top of the FDDI header.
-.Nm
-assumes, when filtering on the protocol identifier, that all FDDI packets
-include an LLC header, and that the LLC header is in so-called SNAP format.
 .It Cm decnet src Ar host
 True if the
 .Tn DECNET
@@ -878,7 +852,6 @@ To access data inside the packet, use th
 .Ar proto
 is one of
 .Cm ether ,
-.Cm fddi ,
 .Cm ip ,
 .Cm arp ,
 .Cm rarp ,
@@ -1069,25 +1042,6 @@ direction
 .Pq in/out
 and interface information are printed out for each packet.
 .Pp
-On FDDI networks, the
-.Fl e
-option causes
-.Nm
-to print the frame control field, the source and destination addresses,
-and the packet length.
-The frame control field governs the interpretation of the rest of the packet.
-Normal packets
-.Pq such as those containing IP datagrams
-are
-.Dq async
-packets, with a priority value between 0 and 7; for example,
-.Sy async4 .
-Such packets are assumed to contain an 802.2 Logical Link Control
-.Pq LLC
-packet; the LLC header is printed if it is
-.Em not
-an ISO datagram or a so-called SNAP packet.
-.Pp
 The following description assumes familiarity with the
 SLIP compression algorithm described in RFC 1144.
 .Pp
@@ -1911,12 +1865,3 @@ networks so we'd have no way of testing
 A packet trace that crosses a daylight saving time change will give
 skewed time stamps
 .Pq the time change is ignored .
-.Pp
-Filter expressions that manipulate FDDI headers assume that all FDDI packets
-are encapsulated Ethernet packets.
-This is true for IP, ARP, and
-.Tn DECNET
-Phase IV,
-but is not true for protocols such as ISO CLNS.
-Therefore, the filter may inadvertently accept certain packets that
-do not properly match the filter expression.
Index: tcpdump.c
===================================================================
RCS file: /cvs/src/usr.sbin/tcpdump/tcpdump.c,v
retrieving revision 1.78
diff -u -p -r1.78 tcpdump.c
--- tcpdump.c 22 Dec 2015 21:01:07 -0000 1.78
+++ tcpdump.c 27 Jan 2016 01:49:10 -0000
@@ -115,7 +115,6 @@ static struct printer printers[] = {
  { sl_if_print, DLT_SLIP },
  { sl_bsdos_if_print, DLT_SLIP_BSDOS },
  { ppp_if_print, DLT_PPP },
- { fddi_if_print, DLT_FDDI },
  { null_if_print, DLT_NULL },
  { raw_if_print, DLT_RAW },
  { atm_if_print, DLT_ATM_RFC1483 },

Reply | Threaded
Open this post in threaded view
|

Re: Simplify tcpdump

Stuart Henderson-6
On 2016/01/26 20:52, Michael McConville wrote:
> Something like this?

Wait to see what others say, but that looks good to me (not yet tested).

> There's a lot to be removed from libpcap too.

We could kind-of do with updating libpcap. It's not a huge problem yet
but we are starting to run into things in ports that require hacks to cope
with our old version. So I'm reluctant to make too many changes over there.
Newer upstream versions also handle the timeval mess better (using normal
timevals internally and convert to fixed-size ones for pcap file i/o,
rather than our approach of bpf_timeval everywhere, which is totally
unworkable for ports that mix bpf_timevals with "real" timevals).

Reply | Threaded
Open this post in threaded view
|

Re: Simplify tcpdump

Michael McConville-3
In reply to this post by Michael McConville-3
Michael McConville wrote:

> Stuart Henderson wrote:
> > On 2016/01/26 20:16, Michael McConville wrote:
> > > Stuart Henderson wrote:
> > > > On 2016/01/25 22:52, Michael McConville wrote:
> > > > > fddi_bitswap is only used once, and it just adds a layer of
> > > > > indirection to its preprocessor condition.
> > > >
> > > > Oh yuk. This is bogus anyway, and there's no good way to handle it. We
> > > > dropped support for FDDI interfaces so it only affect decodes of pcap
> > > > files, and who knows where they were created?
> > >
> > > I'm not familiar with FDDI and I'm new to tcpdump, so I can't offer much
> > > input. How much do you think can/should be removed?
> >
> > FDDI is a dual token-ring network based on 100Mb fibre connections,
> > often over larger distances (campus/metro) than a typical lan. It's
> > obsolete, we removed support for the adapters, the only place this
> > code could possibly be used now is for parsing pcap files captured
> > on another system or from older OpenBSD (and there's a kitchen-sink
> > pcap decoder in ports these days..).
> >
> > This bitswap thing is because some OS bitswap the network addresses
> > (in the driver or somewhere; they are swapped in pcap files) and some
> > don't.
> >
> > I don't think that it's particularly useful for OpenBSD to support
> > decoding this any more. Maybe we should stop rearranging these
> > deckchairs and borrow tedu's axe instead.
>
> Something like this? There's a lot to be removed from libpcap too.

Ping. Does anyone else think this is a good idea? Would anyone miss FDDI
support?


> Index: INSTALL
> ===================================================================
> RCS file: /cvs/src/usr.sbin/tcpdump/INSTALL,v
> retrieving revision 1.6
> diff -u -p -r1.6 INSTALL
> --- INSTALL 5 Dec 2015 21:43:51 -0000 1.6
> +++ INSTALL 27 Jan 2016 01:49:10 -0000
> @@ -15,7 +15,6 @@ bpf_dump.c - bpf instruction pretty-prin
>  decnet.h - DECnet definitions
>  ethertype.h - ethernet definitions
>  extract.h - alignment definitions
> -fddi.h - Fiber Distributed Data Interface definitions
>  gmt2local.c - time conversion routines
>  gmt2local.h - time conversion prototypes
>  igrp.h - Interior Gateway Routing Protocol definitions
> @@ -43,7 +42,6 @@ print-decnet.c - DECnet printer routines
>  print-domain.c - Domain Name System printer routines
>  print-enc.c - Encapsulated printer routines
>  print-ether.c - ethernet printer routines
> -print-fddi.c - Fiber Distributed Data Interface printer routines
>  print-gre.c - Generic Routing Encapsulation printer routines
>  print-icmp.c - Internet Control Message Protocol printer routines
>  print-igrp.c - Interior Gateway Routing Protocol printer routines
> Index: Makefile
> ===================================================================
> RCS file: /cvs/src/usr.sbin/tcpdump/Makefile,v
> retrieving revision 1.59
> diff -u -p -r1.59 Makefile
> --- Makefile 14 Oct 2015 04:55:17 -0000 1.59
> +++ Makefile 27 Jan 2016 01:49:10 -0000
> @@ -28,7 +28,7 @@ CFLAGS+=-Wall -I${.CURDIR}/../../sbin/pf
>  # for pcap-int.h
>  CFLAGS+=-I${.CURDIR}/../../lib/libpcap
>  
> -CFLAGS+=-DCSLIP -DPPP -DHAVE_FDDI -DETHER_SERVICE -DHAVE_NET_SLIP_H -DHAVE_ETHER_NTOHOST -DINET6
> +CFLAGS+=-DCSLIP -DPPP -DETHER_SERVICE -DHAVE_NET_SLIP_H -DHAVE_ETHER_NTOHOST -DINET6
>  
>  LDADD+= -lpcap -ll -lcrypto
>  DPADD+= ${LIBL} ${LIBPCAP} ${LIBCRYPTO}
> @@ -38,7 +38,7 @@ SRCS= tcpdump.c addrtoname.c privsep.c p
>   print-atalk.c print-domain.c print-tftp.c print-bootp.c print-nfs.c \
>   print-icmp.c print-sl.c print-ppp.c print-rip.c print-timed.c \
>   print-snmp.c print-ntp.c print-null.c print-ospf.c print-gtp.c \
> - print-fddi.c print-llc.c print-sunrpc.c print-hsrp.c print-vqp.c \
> + print-llc.c print-sunrpc.c print-hsrp.c print-vqp.c \
>   print-vrrp.c print-wb.c print-decnet.c print-isoclns.c print-ipx.c \
>   print-atm.c print-dvmrp.c print-krb.c print-pim.c print-netbios.c \
>   util.c bpf_dump.c parsenfsfh.c version.c print-igrp.c \
> Index: fddi.h
> ===================================================================
> RCS file: fddi.h
> diff -N fddi.h
> --- fddi.h 7 Oct 2007 16:41:05 -0000 1.7
> +++ /dev/null 1 Jan 1970 00:00:00 -0000
> @@ -1,71 +0,0 @@
> -/* $OpenBSD: fddi.h,v 1.7 2007/10/07 16:41:05 deraadt Exp $ */
> -
> -/*
> - * Copyright (c) 1992, 1993, 1994, 1995, 1996
> - * The Regents of the University of California.  All rights reserved.
> - *
> - * Redistribution and use in source and binary forms, with or without
> - * modification, are permitted provided that: (1) source code distributions
> - * retain the above copyright notice and this paragraph in its entirety, (2)
> - * distributions including binary code include the above copyright notice and
> - * this paragraph in its entirety in the documentation or other materials
> - * provided with the distribution, and (3) all advertising materials mentioning
> - * features or use of this software display the following acknowledgement:
> - * ``This product includes software developed by the University of California,
> - * Lawrence Berkeley Laboratory and its contributors.'' 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 ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
> - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
> - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
> - *
> - * @(#) $Id: fddi.h,v 1.7 2007/10/07 16:41:05 deraadt Exp $ (LBL)
> - */
> -
> -/*
> - * Based on Ultrix if_fddi.h
> - */
> -
> -/*
> - * This stuff should come from a system header file, but there's no
> - * obviously portable way to do that and it's not really going
> - * to change from system to system (except for the padding business).
> - */
> -
> -struct fddi_header {
> - u_char  fddi_fc; /* frame control */
> - u_char  fddi_dhost[6];
> - u_char  fddi_shost[6];
> -};
> -
> -
> -/* Useful values for fddi_fc (frame control) field */
> -
> -/*
> - * FDDI Frame Control bits
> - */
> -#define FDDIFC_C 0x80 /* Class bit */
> -#define FDDIFC_L 0x40 /* Address length bit */
> -#define FDDIFC_F 0x30 /* Frame format bits */
> -#define FDDIFC_Z 0x0f /* Control bits */
> -
> -/*
> - * FDDI Frame Control values. (48-bit addressing only).
> - */
> -#define FDDIFC_VOID 0x40 /* Void frame */
> -#define FDDIFC_NRT 0x80 /* Nonrestricted token */
> -#define FDDIFC_RT 0xc0 /* Restricted token */
> -#define FDDIFC_SMT_INFO 0x41 /* SMT Info */
> -#define FDDIFC_SMT_NSA 0x4F /* SMT Next station adrs */
> -#define FDDIFC_MAC_BEACON 0xc2 /* MAC Beacon frame */
> -#define FDDIFC_MAC_CLAIM 0xc3 /* MAC Claim frame */
> -#define FDDIFC_LLC_ASYNC 0x50 /* Async. LLC frame */
> -#define FDDIFC_LLC_SYNC 0xd0 /* Sync. LLC frame */
> -#define FDDIFC_IMP_ASYNC 0x60 /* Implementor Async. */
> -#define FDDIFC_IMP_SYNC 0xe0 /* Implementor Synch. */
> -#define FDDIFC_SMT 0x40 /* SMT frame */
> -#define FDDIFC_MAC 0xc0 /* MAC frame */
> -
> -#define FDDIFC_CLFF 0xF0 /* Class/Length/Format bits */
> -#define FDDIFC_ZZZZ 0x0F /* Control bits */
> Index: interface.h
> ===================================================================
> RCS file: /cvs/src/usr.sbin/tcpdump/interface.h,v
> retrieving revision 1.66
> diff -u -p -r1.66 interface.h
> --- interface.h 15 Nov 2015 20:35:36 -0000 1.66
> +++ interface.h 27 Jan 2016 01:49:10 -0000
> @@ -205,7 +205,6 @@ extern void pfsync_if_print(u_char *, co
>  extern void pfsync_ip_print(const u_char *, u_int, const u_char *);
>  extern void ether_if_print(u_char *, const struct pcap_pkthdr *,
>   const u_char *);
> -extern void fddi_if_print(u_char *, const struct pcap_pkthdr *, const u_char *);
>  extern void ppp_ether_if_print(u_char *, const struct pcap_pkthdr *,
>   const u_char *);
>  extern void gre_print(const u_char *, u_int);
> Index: print-fddi.c
> ===================================================================
> RCS file: print-fddi.c
> diff -N print-fddi.c
> --- print-fddi.c 16 Nov 2015 00:16:39 -0000 1.17
> +++ /dev/null 1 Jan 1970 00:00:00 -0000
> @@ -1,347 +0,0 @@
> -/* $OpenBSD: print-fddi.c,v 1.17 2015/11/16 00:16:39 mmcc Exp $ */
> -
> -/*
> - * Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996, 1997
> - * The Regents of the University of California.  All rights reserved.
> - *
> - * Redistribution and use in source and binary forms, with or without
> - * modification, are permitted provided that: (1) source code distributions
> - * retain the above copyright notice and this paragraph in its entirety, (2)
> - * distributions including binary code include the above copyright notice and
> - * this paragraph in its entirety in the documentation or other materials
> - * provided with the distribution, and (3) all advertising materials mentioning
> - * features or use of this software display the following acknowledgement:
> - * ``This product includes software developed by the University of California,
> - * Lawrence Berkeley Laboratory and its contributors.'' 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 ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
> - * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
> - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
> - */
> -
> -#ifdef HAVE_FDDI
> -#include <sys/time.h>
> -#include <sys/socket.h>
> -#include <sys/file.h>
> -#include <sys/ioctl.h>
> -
> -struct mbuf;
> -struct rtentry;
> -#include <net/if.h>
> -
> -#include <netinet/in.h>
> -#include <netinet/if_ether.h>
> -#include <netinet/ip.h>
> -
> -#include <ctype.h>
> -#include <netdb.h>
> -#include <pcap.h>
> -#include <stdio.h>
> -#include <string.h>
> -
> -#include "interface.h"
> -#include "addrtoname.h"
> -#include "ethertype.h"
> -
> -#include "fddi.h"
> -
> -/*
> - * Some FDDI interfaces use bit-swapped addresses.
> - */
> -#if defined(ultrix) || defined(__alpha) || defined(__bsdi) || \
> - defined(__NetBSD__) || defined(__OpenBSD__)
> -int fddi_bitswap = 0;
> -#else
> -int fddi_bitswap = 1;
> -#endif
> -
> -/*
> - * FDDI support for tcpdump, by Jeffrey Mogul [DECWRL], June 1992
> - *
> - * Based in part on code by Van Jacobson, which bears this note:
> - *
> - * NOTE:  This is a very preliminary hack for FDDI support.
> - * There are all sorts of wired in constants & nothing (yet)
> - * to print SMT packets as anything other than hex dumps.
> - * Most of the necessary changes are waiting on my redoing
> - * the "header" that a kernel fddi driver supplies to bpf:  I
> - * want it to look like one byte of 'direction' (0 or 1
> - * depending on whether the packet was inbound or outbound),
> - * two bytes of system/driver dependent data (anything an
> - * implementor thinks would be useful to filter on and/or
> - * save per-packet, then the real 21-byte FDDI header.
> - * Steve McCanne & I have also talked about adding the
> - * 'direction' byte to all bpf headers (e.g., in the two
> - * bytes of padding on an ethernet header).  It's not clear
> - * we could do this in a backwards compatible way & we hate
> - * the idea of an incompatible bpf change.  Discussions are
> - * proceeding.
> - *
> - * Also, to really support FDDI (and better support 802.2
> - * over ethernet) we really need to re-think the rather simple
> - * minded assumptions about fixed length & fixed format link
> - * level headers made in gencode.c.  One day...
> - *
> - *  - vj
> - */
> -
> -#define FDDI_HDRLEN (sizeof(struct fddi_header))
> -
> -static u_char fddi_bit_swap[] = {
> - 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
> - 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
> - 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
> - 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
> - 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
> - 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
> - 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
> - 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
> - 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
> - 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
> - 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
> - 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
> - 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
> - 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
> - 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
> - 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
> - 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
> - 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
> - 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
> - 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
> - 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
> - 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
> - 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
> - 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
> - 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
> - 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
> - 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
> - 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
> - 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
> - 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
> - 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
> - 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
> -};
> -
> -/*
> - * Print FDDI frame-control bits
> - */
> -static inline void
> -print_fddi_fc(u_char fc)
> -{
> - switch (fc) {
> -
> - case FDDIFC_VOID:                         /* Void frame */
> - printf("void ");
> - break;
> -
> - case FDDIFC_NRT:                          /* Nonrestricted token */
> - printf("nrt ");
> - break;
> -
> - case FDDIFC_RT:                           /* Restricted token */
> - printf("rt ");
> - break;
> -
> - case FDDIFC_SMT_INFO:                     /* SMT Info */
> - printf("info ");
> - break;
> -
> - case FDDIFC_SMT_NSA:                      /* SMT Next station adrs */
> - printf("nsa ");
> - break;
> -
> - case FDDIFC_MAC_BEACON:                   /* MAC Beacon frame */
> - printf("beacon ");
> - break;
> -
> - case FDDIFC_MAC_CLAIM:                    /* MAC Claim frame */
> - printf("claim ");
> - break;
> -
> - default:
> - switch (fc & FDDIFC_CLFF) {
> -
> - case FDDIFC_MAC:
> - printf("mac%1x ", fc & FDDIFC_ZZZZ);
> - break;
> -
> - case FDDIFC_SMT:
> - printf("smt%1x ", fc & FDDIFC_ZZZZ);
> - break;
> -
> - case FDDIFC_LLC_ASYNC:
> - printf("async%1x ", fc & FDDIFC_ZZZZ);
> - break;
> -
> - case FDDIFC_LLC_SYNC:
> - printf("sync%1x ", fc & FDDIFC_ZZZZ);
> - break;
> -
> - case FDDIFC_IMP_ASYNC:
> - printf("imp_async%1x ", fc & FDDIFC_ZZZZ);
> - break;
> -
> - case FDDIFC_IMP_SYNC:
> - printf("imp_sync%1x ", fc & FDDIFC_ZZZZ);
> - break;
> -
> - default:
> - printf("%02x ", fc);
> - break;
> - }
> - }
> -}
> -
> -/* Extract src, dst addresses */
> -static inline void
> -extract_fddi_addrs(const struct fddi_header *fddip, char *fsrc, char *fdst)
> -{
> - int i;
> -
> - if (fddi_bitswap) {
> - /*
> - * bit-swap the fddi addresses (isn't the IEEE standards
> - * process wonderful!) then convert them to names.
> - */
> - for (i = 0; i < 6; ++i)
> - fdst[i] = fddi_bit_swap[fddip->fddi_dhost[i]];
> - for (i = 0; i < 6; ++i)
> - fsrc[i] = fddi_bit_swap[fddip->fddi_shost[i]];
> - }
> - else {
> - memcpy(fdst, (char *)fddip->fddi_dhost, 6);
> - memcpy(fsrc, (char *)fddip->fddi_shost, 6);
> - }
> -}
> -
> -/*
> - * Print the FDDI MAC header
> - */
> -static inline void
> -fddi_print(const struct fddi_header *fddip, u_int length,
> -   const u_char *fsrc, const u_char *fdst)
> -{
> - char *srcname, *dstname;
> -
> - srcname = etheraddr_string(fsrc);
> - dstname = etheraddr_string(fdst);
> -
> - if (vflag)
> - (void) printf("%02x %s %s %d: ",
> -       fddip->fddi_fc,
> -       srcname, dstname,
> -       length);
> - else if (qflag)
> - printf("%s %s %d: ", srcname, dstname, length);
> - else {
> - (void) print_fddi_fc(fddip->fddi_fc);
> - (void) printf("%s %s %d: ", srcname, dstname, length);
> - }
> -}
> -
> -static inline void
> -fddi_smt_print(const u_char *p, u_int length)
> -{
> - printf("<SMT printer not yet implemented>");
> -}
> -
> -/*
> - * This is the top level routine of the printer.  'sp' is the points
> - * to the FDDI header of the packet, 'tvp' is the timestamp,
> - * 'length' is the length of the packet off the wire, and 'caplen'
> - * is the number of bytes actually captured.
> - */
> -void
> -fddi_if_print(u_char *pcap, const struct pcap_pkthdr *h,
> -      const u_char *p)
> -{
> - u_int caplen = h->caplen;
> - u_int length = h->len;
> - u_short extracted_ethertype;
> - const struct fddi_header *fddip = (struct fddi_header *)p;
> - struct ether_header ehdr;
> -
> - ts_print(&h->ts);
> -
> - if (caplen < FDDI_HDRLEN) {
> - printf("[|fddi]");
> - goto out;
> - }
> - /*
> - * Get the FDDI addresses into a canonical form
> - */
> - 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.
> - * Rather than pass them all the way down, we set these globals.
> - */
> - snapend = p + caplen;
> - /*
> - * Actually, the only printer that uses packetp is print-bootp.c,
> - * and it assumes that packetp points to an Ethernet header.  The
> - * right thing to do is to fix print-bootp.c to know which link
> - * type is in use when it excavates. XXX
> - */
> - packetp = (u_char *)&ehdr;
> -
> - if (eflag)
> - fddi_print(fddip, length, ESRC(&ehdr), EDST(&ehdr));
> -
> - /* Skip over FDDI MAC header */
> - length -= FDDI_HDRLEN;
> - p += FDDI_HDRLEN;
> - caplen -= FDDI_HDRLEN;
> -
> - /* Frame Control field determines interpretation of packet */
> - extracted_ethertype = 0;
> - if ((fddip->fddi_fc & FDDIFC_CLFF) == FDDIFC_LLC_ASYNC) {
> - /* Try to print the LLC-layer header & higher layers */
> - if (llc_print(p, length, caplen, ESRC(&ehdr), EDST(&ehdr))
> -    == 0) {
> - /*
> - * Some kinds of LLC packet we cannot
> - * handle intelligently
> - */
> - if (!eflag)
> - fddi_print(fddip, length,
> -    ESRC(&ehdr), EDST(&ehdr));
> - if (extracted_ethertype) {
> - printf("(LLC %s) ",
> - etherproto_string(htons(extracted_ethertype)));
> - }
> - if (!xflag && !qflag)
> - default_print(p, caplen);
> - }
> - } else if ((fddip->fddi_fc & FDDIFC_CLFF) == FDDIFC_SMT)
> - fddi_smt_print(p, caplen);
> - else {
> - /* Some kinds of FDDI packet we cannot handle intelligently */
> - if (!eflag)
> - fddi_print(fddip, length, ESRC(&ehdr), EDST(&ehdr));
> - if (!xflag && !qflag)
> - default_print(p, caplen);
> - }
> - if (xflag)
> - default_print(p, caplen);
> -out:
> - putchar('\n');
> -}
> -#else
> -#include <sys/types.h>
> -#include <sys/time.h>
> -
> -#include <stdio.h>
> -
> -#include "interface.h"
> -void
> -fddi_if_print(u_char *pcap, const struct pcap_pkthdr *h,
> -      const u_char *p)
> -{
> -
> - error("not configured for fddi");
> - /* NOTREACHED */
> -}
> -#endif
> Index: privsep_pcap.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/tcpdump/privsep_pcap.c,v
> retrieving revision 1.19
> diff -u -p -r1.19 privsep_pcap.c
> --- privsep_pcap.c 1 Oct 2015 13:18:40 -0000 1.19
> +++ privsep_pcap.c 27 Jan 2016 01:49:10 -0000
> @@ -421,9 +421,6 @@ priv_pcap_offline(const char *fname, cha
>   break;
>  
>   case DLT_FDDI:
> - linklen = 13 + 8; /* fddi_header + llc */
> - break;
> -
>   case DLT_NULL:
>   default:
>   linklen = 0;
> @@ -440,11 +437,7 @@ priv_pcap_offline(const char *fname, cha
>   p->buffer = p->sf.base + BPF_ALIGNMENT - (linklen % BPF_ALIGNMENT);
>   p->sf.version_major = hdr.version_major;
>   p->sf.version_minor = hdr.version_minor;
> -#ifdef PCAP_FDDIPAD
> - /* XXX what to do with this? */
> - /* XXX padding only needed for kernel fcode */
> - pcap_fddipad = 0;
> -#endif
> +
>   return (p);
>  
>   bad:
> Index: tcpdump.8
> ===================================================================
> RCS file: /cvs/src/usr.sbin/tcpdump/tcpdump.8,v
> retrieving revision 1.88
> diff -u -p -r1.88 tcpdump.8
> --- tcpdump.8 5 Nov 2015 09:56:21 -0000 1.88
> +++ tcpdump.8 27 Jan 2016 01:49:10 -0000
> @@ -371,7 +371,6 @@ Possible protocols are:
>  .Cm decnet ,
>  .Cm esp ,
>  .Cm ether ,
> -.Cm fddi ,
>  .Cm icmp ,
>  .Cm icmp6 ,
>  .Cm igmp ,
> @@ -418,23 +417,6 @@ means
>  port 53
>  .Dc .
>  .Pp
> -.Cm fddi
> -is actually an alias for
> -.Cm ether ;
> -the parser treats them identically as meaning
> -.Qo
> -the data link level used on the specified network interface
> -.Qc .
> -FDDI
> -.Pq Fiber Distributed Data Interface
> -headers contain Ethernet-like source and destination addresses,
> -and often contain Ethernet-like packet types,
> -so you can filter on these FDDI fields just as with the analogous
> -Ethernet fields.
> -FDDI headers also contain other fields,
> -but you cannot name them explicitly in a filter expression.
> -.El
> -.Pp
>  In addition to the above, there are some special primitive
>  keywords that don't follow the pattern:
>  .Cm gateway ,
> @@ -662,14 +644,6 @@ or
>  These identifiers are also keywords and must be escaped
>  using a backslash character
>  .Pq Sq \e .
> -In the case of FDDI (e.g.,
> -.Dq Cm fddi protocol arp ) ,
> -the protocol identification comes from the 802.2 Logical Link Control
> -.Pq LLC
> -header, which is usually layered on top of the FDDI header.
> -.Nm
> -assumes, when filtering on the protocol identifier, that all FDDI packets
> -include an LLC header, and that the LLC header is in so-called SNAP format.
>  .It Cm decnet src Ar host
>  True if the
>  .Tn DECNET
> @@ -878,7 +852,6 @@ To access data inside the packet, use th
>  .Ar proto
>  is one of
>  .Cm ether ,
> -.Cm fddi ,
>  .Cm ip ,
>  .Cm arp ,
>  .Cm rarp ,
> @@ -1069,25 +1042,6 @@ direction
>  .Pq in/out
>  and interface information are printed out for each packet.
>  .Pp
> -On FDDI networks, the
> -.Fl e
> -option causes
> -.Nm
> -to print the frame control field, the source and destination addresses,
> -and the packet length.
> -The frame control field governs the interpretation of the rest of the packet.
> -Normal packets
> -.Pq such as those containing IP datagrams
> -are
> -.Dq async
> -packets, with a priority value between 0 and 7; for example,
> -.Sy async4 .
> -Such packets are assumed to contain an 802.2 Logical Link Control
> -.Pq LLC
> -packet; the LLC header is printed if it is
> -.Em not
> -an ISO datagram or a so-called SNAP packet.
> -.Pp
>  The following description assumes familiarity with the
>  SLIP compression algorithm described in RFC 1144.
>  .Pp
> @@ -1911,12 +1865,3 @@ networks so we'd have no way of testing
>  A packet trace that crosses a daylight saving time change will give
>  skewed time stamps
>  .Pq the time change is ignored .
> -.Pp
> -Filter expressions that manipulate FDDI headers assume that all FDDI packets
> -are encapsulated Ethernet packets.
> -This is true for IP, ARP, and
> -.Tn DECNET
> -Phase IV,
> -but is not true for protocols such as ISO CLNS.
> -Therefore, the filter may inadvertently accept certain packets that
> -do not properly match the filter expression.
> Index: tcpdump.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/tcpdump/tcpdump.c,v
> retrieving revision 1.78
> diff -u -p -r1.78 tcpdump.c
> --- tcpdump.c 22 Dec 2015 21:01:07 -0000 1.78
> +++ tcpdump.c 27 Jan 2016 01:49:10 -0000
> @@ -115,7 +115,6 @@ static struct printer printers[] = {
>   { sl_if_print, DLT_SLIP },
>   { sl_bsdos_if_print, DLT_SLIP_BSDOS },
>   { ppp_if_print, DLT_PPP },
> - { fddi_if_print, DLT_FDDI },
>   { null_if_print, DLT_NULL },
>   { raw_if_print, DLT_RAW },
>   { atm_if_print, DLT_ATM_RFC1483 },
>