diff options
author | pst <pst@FreeBSD.org> | 1996-08-19 20:34:12 +0000 |
---|---|---|
committer | pst <pst@FreeBSD.org> | 1996-08-19 20:34:12 +0000 |
commit | 97a804ef88319863cfa8146c068ec895f4ad8316 (patch) | |
tree | a0e1430e0d74185364854779b70e6d96aba9cf47 /contrib/tcpdump/print-llc.c | |
download | FreeBSD-src-97a804ef88319863cfa8146c068ec895f4ad8316.zip FreeBSD-src-97a804ef88319863cfa8146c068ec895f4ad8316.tar.gz |
Virgin import of unmodified tcpdump v3.2.1 distribution from LBL.
Obtained from: ftp://ftp.ee.lbl.gov/tcpdump.tar.Z on 19-Aug-1996.
Diffstat (limited to 'contrib/tcpdump/print-llc.c')
-rw-r--r-- | contrib/tcpdump/print-llc.c | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/contrib/tcpdump/print-llc.c b/contrib/tcpdump/print-llc.c new file mode 100644 index 0000000..e8e3f52 --- /dev/null +++ b/contrib/tcpdump/print-llc.c @@ -0,0 +1,195 @@ +/* + * 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. + */ + +/* + * Code by Matt Thomas, Digital Equipment Corporation + * with an awful lot of hacking by Jeffrey Mogul, DECWRL + */ + +#ifndef lint +static char rcsid[] = + "@(#)$Header: print-llc.c,v 1.20 96/07/23 14:17:25 leres Exp $"; +#endif + +#include <sys/param.h> +#include <sys/time.h> + +#include <netinet/in.h> + +#include <ctype.h> +#include <netdb.h> +#include <signal.h> +#include <stdio.h> +#include <string.h> + +#include "interface.h" +#include "addrtoname.h" +#include "extract.h" /* must come after interface.h */ + +#include "llc.h" + +static struct tok cmd2str[] = { + { LLC_UI, "ui" }, + { LLC_TEST, "test" }, + { LLC_XID, "xid" }, + { LLC_UA, "ua" }, + { LLC_DISC, "disc" }, + { LLC_DM, "dm" }, + { LLC_SABME, "sabme" }, + { LLC_FRMR, "frmr" }, + { 0, NULL } +}; + +/* + * Returns non-zero IFF it succeeds in printing the header + */ +int +llc_print(const u_char *p, u_int length, u_int caplen, + const u_char *esrc, const u_char *edst) +{ + struct llc llc; + register u_short et; + register int ret; + + if (caplen < 3) { + (void)printf("[|llc]"); + default_print((u_char *)p, caplen); + return(0); + } + + /* Watch out for possible alignment problems */ + memcpy((char *)&llc, (char *)p, min(caplen, sizeof(llc))); + + if (llc.ssap == LLCSAP_GLOBAL && llc.dsap == LLCSAP_GLOBAL) { + ipx_print(p, length); + return (1); + } +#ifdef notyet + else if (p[0] == 0xf0 && p[1] == 0xf0) + netbios_print(p, length); +#endif + if (llc.ssap == LLCSAP_ISONS && llc.dsap == LLCSAP_ISONS + && llc.llcui == LLC_UI) { + isoclns_print(p + 3, length - 3, caplen - 3, esrc, edst); + return (1); + } + + if (llc.ssap == LLCSAP_SNAP && llc.dsap == LLCSAP_SNAP + && llc.llcui == LLC_UI) { + if (caplen < sizeof(llc)) { + (void)printf("[|llc-snap]"); + default_print((u_char *)p, caplen); + return (0); + } + if (vflag) + (void)printf("snap %s ", protoid_string(llc.llcpi)); + + caplen -= sizeof(llc); + length -= sizeof(llc); + p += sizeof(llc); + + /* This is an encapsulated Ethernet packet */ + et = EXTRACT_16BITS(&llc.ethertype[0]); + ret = ether_encap_print(et, p, length, caplen); + if (ret) + return (ret); + } + + if ((llc.ssap & ~LLC_GSAP) == llc.dsap) { + if (eflag) + (void)printf("%s ", llcsap_string(llc.dsap)); + else + (void)printf("%s > %s %s ", + etheraddr_string(esrc), + etheraddr_string(edst), + llcsap_string(llc.dsap)); + } else { + if (eflag) + (void)printf("%s > %s ", + llcsap_string(llc.ssap & ~LLC_GSAP), + llcsap_string(llc.dsap)); + else + (void)printf("%s %s > %s %s ", + etheraddr_string(esrc), + llcsap_string(llc.ssap & ~LLC_GSAP), + etheraddr_string(edst), + llcsap_string(llc.dsap)); + } + + if ((llc.llcu & LLC_U_FMT) == LLC_U_FMT) { + const char *m; + char f; + m = tok2str(cmd2str, "%02x", LLC_U_CMD(llc.llcu)); + switch ((llc.ssap & LLC_GSAP) | (llc.llcu & LLC_U_POLL)) { + case 0: f = 'C'; break; + case LLC_GSAP: f = 'R'; break; + case LLC_U_POLL: f = 'P'; break; + case LLC_GSAP|LLC_U_POLL: f = 'F'; break; + default: f = '?'; break; + } + + printf("%s/%c", m, f); + + p += 3; + length -= 3; + caplen -= 3; + + if ((llc.llcu & ~LLC_U_POLL) == LLC_XID) { + if (*p == LLC_XID_FI) { + printf(": %02x %02x", p[1], p[2]); + p += 3; + length -= 3; + caplen -= 3; + } + } + } else { + char f; + llc.llcis = ntohs(llc.llcis); + switch ((llc.ssap & LLC_GSAP) | (llc.llcu & LLC_U_POLL)) { + case 0: f = 'C'; break; + case LLC_GSAP: f = 'R'; break; + case LLC_U_POLL: f = 'P'; break; + case LLC_GSAP|LLC_U_POLL: f = 'F'; break; + default: f = '?'; break; + } + + if ((llc.llcu & LLC_S_FMT) == LLC_S_FMT) { + static char *llc_s[] = { "rr", "rej", "rnr", "03" }; + (void)printf("%s (r=%d,%c)", + llc_s[LLC_S_CMD(llc.llcis)], + LLC_IS_NR(llc.llcis), + f); + } else { + (void)printf("I (s=%d,r=%d,%c)", + LLC_I_NS(llc.llcis), + LLC_IS_NR(llc.llcis), + f); + } + p += 4; + length -= 4; + caplen -= 4; + } + (void)printf(" len=%d", length); + if (caplen > 0) { + default_print_unaligned(p, caplen); + } + return(1); +} |