#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
#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" },
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) {
}
}
+/*
+ * 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)
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)
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;
return (0);
}
while ((int)--length >= 0) {
- if (cp >= (char *)ep) {
+ if (cp >= (const char *)ep) {
fputs(tstr, stdout);
return (0);
}
{
register struct hnamemem *tp, *tp2;
register int i = (atnet << 8) | athost;
- char nambuf[256];
+ char nambuf[MAXHOSTNAMELEN + 20];
static int first = 1;
FILE *fp;
;
tp->addr = i3;
tp->nxt = newhnamemem();
- tp->name = savestr(nambuf);
+ tp->name = strdup(nambuf);
}
fclose(fp);
}
tp->nxt = newhnamemem();
(void)snprintf(nambuf, sizeof(nambuf), "%s.%d",
tp2->name, athost);
- tp->name = savestr(nambuf);
+ tp->name = strdup(nambuf);
return (tp->name);
}
else
(void)snprintf(nambuf, sizeof(nambuf), "%d.%d", atnet >> 8,
atnet & 0xff);
- tp->name = savestr(nambuf);
+ tp->name = strdup(nambuf);
return (tp->name);
}