12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 2000
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *	The Regents of the University of California.  All rights reserved.
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code distributions
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * retain the above copyright notice and this paragraph in its entirety, (2)
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions including binary code include the above copyright notice and
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this paragraph in its entirety in the documentation or other materials
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * provided with the distribution, and (3) all advertising materials mentioning
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * features or use of this software display the following acknowledgement:
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ``This product includes software developed by the University of California,
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the University nor the names of its contributors may be used to endorse
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * or promote products derived from this software without specific prior
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * written permission.
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ =
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project    "@(#) $Header: /tcpdump/master/tcpdump/print-symantec.c,v 1.4.2.1 2005/07/07 01:24:39 guy Exp $ (LBL)";
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <pcap.h>
342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ethertype.h"
382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ether.h"
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct symantec_header {
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t  stuff1[6];
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int16_t ether_type;
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int8_t  stuff2[36];
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic inline void
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectsymantec_hdr_print(register const u_char *bp, u_int length)
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	register const struct symantec_header *sp;
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int16_t etype;
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	sp = (const struct symantec_header *)bp;
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	etype = ntohs(sp->ether_type);
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (!qflag) {
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	        if (etype <= ETHERMTU)
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		          (void)printf("invalid ethertype %u", etype);
592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                else
602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		          (void)printf("ethertype %s (0x%04x)",
612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project				       tok2str(ethertype_values,"Unknown", etype),
622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                                       etype);
632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        } else {
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                if (etype <= ETHERMTU)
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                          (void)printf("invalid ethertype %u", etype);
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                else
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project                          (void)printf("%s", tok2str(ethertype_values,"Unknown Ethertype (0x%04x)", etype));
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project        }
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	(void)printf(", length %u: ", length);
712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * This is the top level routine of the printer.  'p' points
752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * to the ether header of the packet, 'h->ts' is the timestamp,
762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 'h->len' is the length of the packet off the wire, and 'h->caplen'
772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * is the number of bytes actually captured.
782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectu_int
802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectsymantec_if_print(const struct pcap_pkthdr *h, const u_char *p)
812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int length = h->len;
832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_int caplen = h->caplen;
842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct symantec_header *sp;
852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_short ether_type;
862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	u_short extracted_ether_type;
872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (caplen < sizeof (struct symantec_header)) {
892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		printf("[|symantec]");
902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		return caplen;
912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (eflag)
942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		symantec_hdr_print(p, length);
952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	length -= sizeof (struct symantec_header);
972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	caplen -= sizeof (struct symantec_header);
982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	sp = (struct symantec_header *)p;
992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	p += sizeof (struct symantec_header);
1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	ether_type = ntohs(sp->ether_type);
1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	if (ether_type <= ETHERMTU) {
1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* ether_type not known, print raw packet */
1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!eflag)
1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			symantec_hdr_print((u_char *)sp, length + sizeof (struct symantec_header));
1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!suppress_default_print)
1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			default_print(p, caplen);
1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	} else if (ether_encap_print(ether_type, p, length, caplen,
1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	    &extracted_ether_type) == 0) {
1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* ether_type not known, print raw packet */
1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!eflag)
1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			symantec_hdr_print((u_char *)sp, length + sizeof (struct symantec_header));
1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (!suppress_default_print)
1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			default_print(p, caplen);
1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	return (sizeof (struct symantec_header));
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
122