]> The Tcpdump Group git mirrors - tcpdump/blobdiff - print-atalk.c
There's no link-layer header on Linux ARPHRD_ATM packets; there's
[tcpdump] / print-atalk.c
index 274e0fb571d235e9f40cbe5d1e34b47703059517..0c6da83443c3dc2ad7ee92281c7be18bc7a8a3e6 100644 (file)
@@ -23,7 +23,7 @@
 
 #ifndef lint
 static const char rcsid[] =
-    "@(#) $Header: /tcpdump/master/tcpdump/print-atalk.c,v 1.54 2000-04-02 23:50:48 itojun Exp $ (LBL)";
+    "@(#) $Header: /tcpdump/master/tcpdump/print-atalk.c,v 1.69 2001-09-17 21:57:55 fenner Exp $ (LBL)";
 #endif
 
 #ifdef HAVE_CONFIG_H
@@ -34,31 +34,19 @@ static const char rcsid[] =
 #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/in_systm.h>
-#include <netinet/ip.h>
-#include <netinet/ip_var.h>
-#include <netinet/if_ether.h>
-#include <netinet/udp.h>
-#include <netinet/udp_var.h>
-#include <netinet/tcp.h>
 
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <netdb.h>             /* for MAXHOSTNAMELEN on some platforms */
+#include <pcap.h>
 
 #include "interface.h"
 #include "addrtoname.h"
 #include "ethertype.h"
 #include "extract.h"                   /* must come after interface.h */
 #include "appletalk.h"
-#include "savestr.h"
 
 static struct tok type2str[] = {
        { ddpRTMP,              "rtmp" },
@@ -96,17 +84,35 @@ static void ddp_print(const u_char *, u_int, int, u_short, u_char, u_char);
 static const char *ddpskt_string(int);
 
 /*
- * Print AppleTalk Datagram Delivery Protocol packets.
+ * Print LLAP packets received on a physical LocalTalk interface.
  */
 void
-atalk_print(register const u_char *bp, u_int length)
+ltalk_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
+{
+       snapend = p + h->caplen;
+       ++infodelay;
+       ts_print(&h->ts);
+       llap_print(p, h->caplen);
+       if(xflag)
+               default_print(p, h->caplen);
+       putchar('\n');
+       --infodelay;
+       if (infoprint)
+               info(0);
+}
+
+/*
+ * Print AppleTalk LLAP packets.
+ */
+void
+llap_print(register const u_char *bp, u_int length)
 {
        register const struct LAP *lp;
        register const struct atDDP *dp;
        register const struct atShortDDP *sdp;
        u_short snet;
 
-       lp = (struct LAP *)bp;
+       lp = (const struct LAP *)bp;
        bp += sizeof(*lp);
        length -= sizeof(*lp);
        switch (lp->type) {
@@ -156,6 +162,48 @@ atalk_print(register const u_char *bp, u_int length)
        }
 }
 
+/*
+ * Print EtherTalk/TokenTalk packets (or FDDITalk, or whatever it's called
+ * when it runs over FDDI; yes, I've seen FDDI captures with AppleTalk
+ * packets in them).
+ */
+void
+atalk_print(register const u_char *bp, u_int length)
+{
+       register const struct atDDP *dp;
+       u_short snet;
+
+       if (length < ddpSize) {
+         (void)printf(" [|ddp %d]", length);
+         return;
+       }
+       dp = (const struct atDDP *)bp;
+       snet = EXTRACT_16BITS(&dp->srcNet);
+       printf("%s.%s", ataddr_string(snet, dp->srcNode),
+              ddpskt_string(dp->srcSkt));
+       printf(" > %s.%s:",
+              ataddr_string(EXTRACT_16BITS(&dp->dstNet), dp->dstNode),
+              ddpskt_string(dp->dstSkt));
+       bp += ddpSize;
+       length -= ddpSize;
+#ifdef LBL_ALIGN
+       if ((long)bp & 3) {
+               static u_char *abuf = NULL;
+
+               if (abuf == NULL) {
+                       abuf = (u_char *)malloc(snaplen);
+                       if (abuf == NULL)
+                               error("atalk_print: malloc");
+               }
+               memcpy((char *)abuf, (char *)bp, min(length, snaplen));
+               snapend += abuf - (u_char *)bp;
+               packetp = abuf;
+               bp = abuf;
+       }
+#endif
+       ddp_print(bp, length, dp->type, snet, dp->srcNode, dp->srcSkt);
+}
+
 /* XXX should probably pass in the snap header and do checks like arp_print() */
 void
 aarp_print(register const u_char *bp, u_int length)
@@ -190,6 +238,9 @@ aarp_print(register const u_char *bp, u_int length)
            ap->halen, ap->palen);
 }
 
+/*
+ * Print AppleTalk Datagram Delivery Protocol packets.
+ */
 static void
 ddp_print(register const u_char *bp, register u_int length, register int t,
          register u_short snet, register u_char snode, u_char skt)
@@ -339,7 +390,7 @@ nbp_print(register const struct atNBP *np, u_int length, register u_short snet,
          register u_char snode, register u_char skt)
 {
        register const struct atNBPtuple *tp =
-                       (struct atNBPtuple *)((u_char *)np + nbpHeaderSize);
+               (const struct atNBPtuple *)((u_char *)np + nbpHeaderSize);
        int i;
        const u_char *ep;
 
@@ -415,7 +466,7 @@ print_cstring(register const char *cp, register const u_char *ep)
                return (0);
        }
        while ((int)--length >= 0) {
-               if (cp >= (char *)ep) {
+               if (cp >= (const char *)ep) {
                        fputs(tstr, stdout);
                        return (0);
                }
@@ -492,7 +543,7 @@ ataddr_string(u_short atnet, u_char athost)
 {
        register struct hnamemem *tp, *tp2;
        register int i = (atnet << 8) | athost;
-       char nambuf[256];
+       char nambuf[MAXHOSTNAMELEN + 20];
        static int first = 1;
        FILE *fp;
 
@@ -524,7 +575,7 @@ ataddr_string(u_short atnet, u_char athost)
                                ;
                        tp->addr = i3;
                        tp->nxt = newhnamemem();
-                       tp->name = savestr(nambuf);
+                       tp->name = strdup(nambuf);
                }
                fclose(fp);
        }
@@ -541,7 +592,7 @@ ataddr_string(u_short atnet, u_char athost)
                        tp->nxt = newhnamemem();
                        (void)snprintf(nambuf, sizeof(nambuf), "%s.%d",
                            tp2->name, athost);
-                       tp->name = savestr(nambuf);
+                       tp->name = strdup(nambuf);
                        return (tp->name);
                }
 
@@ -553,7 +604,7 @@ ataddr_string(u_short atnet, u_char athost)
        else
                (void)snprintf(nambuf, sizeof(nambuf), "%d.%d", atnet >> 8,
                    atnet & 0xff);
-       tp->name = savestr(nambuf);
+       tp->name = strdup(nambuf);
 
        return (tp->name);
 }