tcpdump mailing list archives

[PATCH] tiny make target for embedded systems


From: "Jesse Dutton" <jessedutton () gmail com>
Date: Thu, 27 Jul 2006 15:31:17 -0700

This patch against 3.9.4 adds the tiny target to the Makefile, which
is size optimized for embedded systems. It includes printers for
ethernet, llc, 802.11, ppp, ppoe, ip, tcp, and udp only. The resulting
binary is 67k larger than libpcap (stripped). The normal target is
468k larger than pcap on my machine.

Jesse

---

diff -ruNa tcpdump-3.9.4/Makefile.in changed/Makefile.in
--- tcpdump-3.9.4/Makefile.in   2005-09-20 00:05:36.000000000 -0600
+++ changed/Makefile.in 2006-07-26 21:52:16.000000000 -0600
@@ -89,6 +89,11 @@
       print-timed.c print-token.c print-udp.c print-vjc.c print-vrrp.c \
       print-wb.c print-zephyr.c setsignal.c tcpdump.c util.c

+TINY =  addrtoname.c cpack.c gmpls.c oui.c gmt2local.c ipproto.c \
+        nlpid.c l2vpn.c machdep.c parsenfsfh.c print-802_11.c print-ascii.c \
+        print-ether.c print-icmp.c print-ip.c print-llc.c print-ppp.c \
+        print-pppoe.c print-tcp.c print-udp.c setsignal.c tcpdump.c util.c
+
LOCALSRC = @LOCALSRC@
GENSRC = version.c
LIBOBJS = @LIBOBJS@
@@ -126,6 +131,10 @@
       @rm -f $@
       $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(OBJ) $(LIBS)

+tiny: $(GENSRC:.c=.o) $(LIBOBJS) @V_PCAPDEP@
+       @rm -f tcpdump $(TINY:.c=.o)
+       $(CC) -DTINY $(CFLAGS) $(LDFLAGS) -o tcpdump $(TINY)
$(GENSRC:.c=.o) $(LIBOBJS) $(LIBS)
+
datalinks.o: $(srcdir)/missing/datalinks.c
       $(CC) $(CFLAGS) -o $@ -c $(srcdir)/missing/datalinks.c
dlnames.o: $(srcdir)/missing/dlnames.c
diff -ruNa tcpdump-3.9.4/addrtoname.c changed/addrtoname.c
--- tcpdump-3.9.4/addrtoname.c  2005-09-29 01:46:45.000000000 -0600
+++ changed/addrtoname.c        2006-07-26 20:15:20.000000000 -0600
@@ -1113,6 +1113,7 @@
       init_ipxsaparray();
}

+#ifndef TINY
const char *
dnaddr_string(u_short dnaddr)
{
@@ -1132,6 +1133,7 @@

       return(tp->name);
}
+#endif

/* Return a zero'ed hnamemem struct and cuts down on calloc() overhead */
struct hnamemem *
diff -ruNa tcpdump-3.9.4/print-ether.c changed/print-ether.c
--- tcpdump-3.9.4/print-ether.c 2005-07-10 08:47:57.000000000 -0600
+++ changed/print-ether.c       2006-07-26 21:06:00.000000000 -0600
@@ -190,6 +190,7 @@
               ip_print(gndo, p, length);
               return (1);

+#ifndef TINY
#ifdef INET6
       case ETHERTYPE_IPV6:
               ip6_print(p, length);
@@ -200,7 +201,6 @@
       case ETHERTYPE_REVARP:
               arp_print(gndo, p, length, caplen);
               return (1);
-
       case ETHERTYPE_DN:
               decnet_print(p, length, caplen);
               return (1);
@@ -279,16 +279,18 @@
        case ETHERTYPE_ISO:
                isoclns_print(p+1, length-1, length-1);
                return(1);
+#endif

       case ETHERTYPE_PPPOED:
       case ETHERTYPE_PPPOES:
               pppoe_print(p, length);
               return (1);

+#ifndef TINY
       case ETHERTYPE_EAPOL:
               eap_print(gndo, p, length);
               return (1);
-
+#endif
       case ETHERTYPE_PPP:
               if (length) {
                       printf(": ");
@@ -296,6 +298,7 @@
               }
               return (1);

+#ifndef TINY
       case ETHERTYPE_SLOW:
               slow_print(p, length);
               return (1);
@@ -313,6 +316,7 @@
       case ETHERTYPE_MOPRC:
       case ETHERTYPE_MOPDL:
               /* default_print for now */
+#endif
       default:
               return (0);
       }
diff -ruNa tcpdump-3.9.4/print-ip.c changed/print-ip.c
--- tcpdump-3.9.4/print-ip.c    2005-09-20 00:05:38.000000000 -0600
+++ changed/print-ip.c  2006-07-26 20:25:55.000000000 -0600
@@ -372,7 +372,7 @@

again:
       switch (ipds->nh) {
-
+/*
       case IPPROTO_AH:
               ipds->nh = *ipds->cp;
               ipds->advance = ah_print(ipds->cp);
@@ -415,7 +415,7 @@
       case IPPROTO_DCCP:
               dccp_print(ipds->cp, (const u_char *)ipds->ip, ipds->len);
               break;
-
+*/
       case IPPROTO_TCP:
               tcp_print(ipds->cp, ipds->len, (const u_char *)ipds->ip,
                         (ipds->off &~ 0x6000));
@@ -431,7 +431,8 @@
               icmp_print(ipds->cp, ipds->len, (const u_char *)ipds->ip,
                          (ipds->off & 0x3fff));
               break;
-
+
+#ifndef TINY
       case IPPROTO_PIGP:
               /*
                * XXX - the current IANA protocol number assignments
@@ -509,7 +510,7 @@
       case IPPROTO_PGM:
               pgm_print(ipds->cp, ipds->len, (const u_char *)ipds->ip);
               break;
-
+#endif
       default:
               if ((proto = getprotobynumber(ipds->nh)) != NULL)
                       ND_PRINT((ndo, " %s", proto->p_name));
@@ -710,11 +711,13 @@
       case 4:
               ip_print (gndo, bp, length);
               return;
+#ifndef TINY
#ifdef INET6
       case 6:
               ip6_print (bp, length);
               return;
#endif
+#endif
       default:
               (void)printf("unknown ip %d", IP_V(&hdr));
               return;
diff -ruNa tcpdump-3.9.4/print-llc.c changed/print-llc.c
--- tcpdump-3.9.4/print-llc.c   2005-09-29 01:40:13.000000000 -0600
+++ changed/print-llc.c 2006-07-26 21:20:06.000000000 -0600
@@ -179,6 +179,7 @@
               is_u = 0;
       }

+#ifndef TINY
       if (ssap == LLCSAP_GLOBAL && dsap == LLCSAP_GLOBAL) {
               /*
                * This is an Ethernet_802.3 IPX frame; it has an
@@ -201,6 +202,7 @@
            ipx_print(p, length);
            return (1);
       }
+#endif

       if (eflag) {
                printf("LLC, dsap %s (0x%02x), ssap %s (0x%02x)",
@@ -216,11 +218,13 @@
               }
       }

+#ifndef TINY
       if (ssap == LLCSAP_8021D && dsap == LLCSAP_8021D &&
           control == LLC_UI) {
               stp_print(p+3, length-3);
               return (1);
       }
+#endif

       if (ssap == LLCSAP_IP && dsap == LLCSAP_IP &&
           control == LLC_UI) {
@@ -228,6 +232,7 @@
               return (1);
       }

+#ifndef TINY
       if (ssap == LLCSAP_IPX && dsap == LLCSAP_IPX &&
           control == LLC_UI) {
               /*
@@ -292,6 +297,7 @@
               if (ret)
                       return (ret);
       }
+#endif

       if (!eflag) {
               if (ssap == dsap) {
@@ -404,6 +410,7 @@
                       return (ret);
               break;

+#ifndef TINY
       case OUI_APPLETALK:
               if (et == ETHERTYPE_ATALK) {
                       /*
@@ -427,6 +434,7 @@
                       return (1);
               }
               break;
+#endif

       case OUI_RFC2684:
               switch (et) {
@@ -451,6 +459,7 @@
                       ether_print(p, length, caplen);
                       return (1);

+#ifndef TINY
               case PID_RFC2684_802_5_FCS:
               case PID_RFC2684_802_5_NOFCS:
                       /*
@@ -496,6 +505,7 @@
               case PID_RFC2684_BPDU:
                       stp_print(p, length);
                       return (1);
+#endif
               }
       }
       return (0);
diff -ruNa tcpdump-3.9.4/print-ppp.c changed/print-ppp.c
--- tcpdump-3.9.4/print-ppp.c   2005-06-18 17:56:40.000000000 -0600
+++ changed/print-ppp.c 2006-07-26 21:22:37.000000000 -0600
@@ -1234,11 +1234,13 @@
        case PPP_IP:
               ip_print(gndo, b+1, t - b - 1);
               goto cleanup;
+#ifndef TINY
#ifdef INET6
        case PPP_IPV6:
            ip6_print(b+1, t - b - 1);
            goto cleanup;
#endif
+#endif
        default: /* no luck - try next guess */
            break;
        }
@@ -1298,6 +1300,7 @@
       case PPP_IP:
               ip_print(gndo, p, length);
               break;
+#ifndef TINY
#ifdef INET6
       case ETHERTYPE_IPV6:    /*XXX*/
       case PPP_IPV6:
@@ -1315,6 +1318,7 @@
       case PPP_MPLS_MCAST:
               mpls_print(p, length);
               break;
+#endif
       case PPP_COMP:
               printf("compressed PPP data");
               break;
@@ -1498,9 +1502,11 @@
               handle_ppp(proto, p, length);
               break;

+#ifndef TINY
       case CHDLC_UNICAST:
       case CHDLC_BCAST:
               return (chdlc_if_print(h, p));
+#endif

       default:
               if (eflag)
@@ -1610,6 +1616,7 @@
                       case PPP_IP:
                               ip_print(p, length);
                               break;
+#ifndef TINY
#ifdef INET6
                       case PPP_IPV6:
                               ip6_print(p, length);
@@ -1621,6 +1628,7 @@
                               break;
                       }
                       goto printx;
+#endif
               case PPP_VJNC:
                       ptype = vjc_print(q, ptype);
                       hdrlength = PPP_BSDI_HDRLEN;
@@ -1629,6 +1637,7 @@
                       case PPP_IP:
                               ip_print(p, length);
                               break;
+#ifndef TINY
#ifdef INET6
                       case PPP_IPV6:
                               ip6_print(p, length);
@@ -1640,6 +1649,7 @@
                               break;
                       }
                       goto printx;
+#endif
               default:
                       if (eflag) {
                               printf("CH=[");
@@ -1661,6 +1671,7 @@
       case PPP_IP:
               ip_print(p, length);
               break;
+#ifndef TINY
#ifdef INET6
       case PPP_IPV6:
               ip6_print(p, length);
@@ -1670,6 +1681,7 @@
        case PPP_MPLS_MCAST:
                mpls_print(p, length);
                break;
+#endif
       default:
               printf("%s ", tok2str(ppptype2str, "unknown PPP
protocol (0x%04x)", ptype));
       }
diff -ruNa tcpdump-3.9.4/print-tcp.c changed/print-tcp.c
--- tcpdump-3.9.4/print-tcp.c   2005-04-21 00:36:05.000000000 -0600
+++ changed/print-tcp.c 2006-07-26 21:10:45.000000000 -0600
@@ -30,6 +30,10 @@
#include "config.h"
#endif

+#ifdef TINY
+#undef INET6
+#endif
+
#include <tcpdump-stdinc.h>

#include <stdio.h>
@@ -224,6 +228,7 @@

       hlen = TH_OFF(tp) * 4;

+#ifndef TINY
       /*
        * If data present, header length valid, and NFS port used,
        * assume NFS.
@@ -244,6 +249,7 @@
                       return;
               }
       }
+#endif
#ifdef INET6
       if (ip6) {
               if (ip6->ip6_nxt == IPPROTO_TCP) {
@@ -653,6 +659,8 @@
       if (flags & TH_RST) {
               if (vflag)
                       print_tcp_rst_data(bp, length);
+
+#ifndef TINY
       } else {
               if (sport == TELNET_PORT || dport == TELNET_PORT) {
                       if (!qflag && vflag)
@@ -681,6 +689,7 @@
                else if (length > 0 && (sport == LDP_PORT || dport ==
LDP_PORT)) {
                        ldp_print(bp, length);
               }
+#endif
       }
       return;
bad:
diff -ruNa tcpdump-3.9.4/print-udp.c changed/print-udp.c
--- tcpdump-3.9.4/print-udp.c   2005-04-06 18:28:17.000000000 -0600
+++ changed/print-udp.c 2006-07-26 21:14:36.000000000 -0600
@@ -28,6 +28,10 @@
#include "config.h"
#endif

+#ifdef TINY
+#undef INET6
+#endif
+
#include <tcpdump-stdinc.h>

#ifdef SEGSIZE
@@ -467,6 +471,7 @@
               (void)printf("truncated-udplength %d", ulen);
               return;
       }
+#ifndef TINY
       if (packettype) {
               register struct sunrpc_msg *rp;
               enum sunrpc_msg_type direction;
@@ -566,6 +571,7 @@
                       return;
               }
       }
+#endif
       udpipaddr_print(ip, sport, dport);

       if (IP_V(ip) == 4 && (vflag > 1) && !fragmented) {
@@ -595,6 +601,7 @@
#endif

       if (!qflag) {
+#ifndef TINY
#define ISPORT(p) (dport == (p) || sport == (p))
               if (ISPORT(NAMESERVER_PORT))
                       ns_print((const u_char *)(up + 1), length, 0);
@@ -689,6 +696,7 @@
                       (void)printf("UDP, length %u",
                           (u_int32_t)(ulen - sizeof(*up)));
#undef ISPORT
+#endif
       } else
               (void)printf("UDP, length %u", (u_int32_t)(ulen - sizeof(*up)));
}
diff -ruNa tcpdump-3.9.4/tcpdump.c changed/tcpdump.c
--- tcpdump-3.9.4/tcpdump.c     2005-08-23 04:29:41.000000000 -0600
+++ changed/tcpdump.c   2006-07-26 21:25:43.000000000 -0600
@@ -135,6 +135,31 @@
       int type;
};

+#ifdef TINY
+static struct printer printers[] = {
+       { ether_if_print,       DLT_EN10MB },
+       { ppp_if_print,         DLT_PPP },
+#ifdef DLT_PPP_WITHDIRECTION
+       { ppp_if_print,         DLT_PPP_WITHDIRECTION },
+#endif
+#ifdef DLT_PPP_BSDOS
+       { ppp_bsdos_if_print,   DLT_PPP_BSDOS },
+#endif
+#ifdef DLT_PPP_SERIAL
+       { ppp_hdlc_if_print,    DLT_PPP_SERIAL },
+#endif
+#ifdef DLT_PPP_ETHER
+       { pppoe_if_print,       DLT_PPP_ETHER },
+#endif
+#ifdef DLT_IEEE802_11
+       { ieee802_11_if_print,  DLT_IEEE802_11},
+#endif
+#ifdef DLT_IEEE802_11_RADIO
+       { ieee802_11_radio_if_print,    DLT_IEEE802_11_RADIO },
+#endif
+       { NULL,                 0 },
+};
+#else
static struct printer printers[] = {
       { arcnet_if_print,      DLT_ARCNET },
#ifdef DLT_ARCNET_LINUX
@@ -267,6 +292,7 @@
#endif
       { NULL,                 0 },
};
+#endif

static if_printer
lookup_printer(int type)
-
This is the tcpdump-workers list.
Visit https://lists.sandelman.ca/ to unsubscribe.


Current thread: