GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.sbin/tcpdump/print-atm.c Lines: 0 46 0.0 %
Date: 2017-11-07 Branches: 0 27 0.0 %

Line Branch Exec Source
1
/*	$OpenBSD: print-atm.c,v 1.12 2015/01/16 06:40:21 deraadt Exp $	*/
2
3
/*
4
 * Copyright (c) 1994, 1995, 1996, 1997
5
 *	The Regents of the University of California.  All rights reserved.
6
 *
7
 * Redistribution and use in source and binary forms, with or without
8
 * modification, are permitted provided that: (1) source code distributions
9
 * retain the above copyright notice and this paragraph in its entirety, (2)
10
 * distributions including binary code include the above copyright notice and
11
 * this paragraph in its entirety in the documentation or other materials
12
 * provided with the distribution, and (3) all advertising materials mentioning
13
 * features or use of this software display the following acknowledgement:
14
 * ``This product includes software developed by the University of California,
15
 * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
16
 * the University nor the names of its contributors may be used to endorse
17
 * or promote products derived from this software without specific prior
18
 * written permission.
19
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
20
 * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
21
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
22
 */
23
24
#include <sys/time.h>
25
#include <sys/socket.h>
26
27
struct mbuf;
28
struct rtentry;
29
#include <net/if.h>
30
31
#include <netinet/in.h>
32
#include <netinet/if_ether.h>
33
#include <netinet/ip.h>
34
#include <netinet/ip_var.h>
35
#include <netinet/udp.h>
36
#include <netinet/udp_var.h>
37
#include <netinet/tcp.h>
38
39
#include <stdio.h>
40
#include <pcap.h>
41
42
#include "interface.h"
43
#include "addrtoname.h"
44
#include "ethertype.h"
45
46
/*
47
 * This is the top level routine of the printer.  'p' is the points
48
 * to the LLC/SNAP header of the packet, 'tvp' is the timestamp,
49
 * 'length' is the length of the packet off the wire, and 'caplen'
50
 * is the number of bytes actually captured.
51
 */
52
void
53
atm_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
54
{
55
	u_int caplen = h->caplen;
56
	u_int length = h->len;
57
	u_short ethertype;
58
59
	ts_print(&h->ts);
60
61
	if (caplen < 8) {
62
		printf("[|atm]");
63
		goto out;
64
	}
65
	if (p[0] != 0xaa || p[1] != 0xaa || p[2] != 0x03) {
66
		/*XXX assume 802.6 MAC header from fore driver */
67
#define MIN_ATM_8026_HDRLEN (20 + 8)
68
		if (caplen < MIN_ATM_8026_HDRLEN) {
69
			printf("[|atm]");
70
			goto out;
71
		}
72
		if (eflag)
73
			printf("%04x%04x %04x%04x ",
74
			       p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3],
75
			       p[4] << 24 | p[5] << 16 | p[6] << 8 | p[7],
76
			       p[8] << 24 | p[9] << 16 | p[10] << 8 | p[11],
77
			       p[12] << 24 | p[13] << 16 | p[14] << 8 | p[15]);
78
		p += 20;
79
		length -= 20;
80
		caplen -= 20;
81
	}
82
	ethertype = p[6] << 8 | p[7];
83
	if (eflag)
84
		printf("%02x %02x %02x %02x-%02x-%02x %04x: ",
85
		       p[0], p[1], p[2], /* dsap/ssap/ctrl */
86
		       p[3], p[4], p[5], /* manufacturer's code */
87
		       ethertype);
88
89
	/*
90
	 * Some printers want to get back at the ethernet addresses,
91
	 * and/or check that they're not walking off the end of the packet.
92
	 * Rather than pass them all the way down, we set these globals.
93
	 */
94
	packetp = p;
95
	snapend = p + caplen;
96
97
	length -= 8;
98
	caplen -= 8;
99
	p += 8;
100
101
	switch (ethertype) {
102
103
	case ETHERTYPE_IP:
104
		ip_print(p, length);
105
		break;
106
107
#ifdef INET6
108
	case ETHERTYPE_IPV6:
109
		ip6_print(p, length);
110
		break;
111
#endif /*INET6*/
112
113
		/*XXX this probably isn't right */
114
	case ETHERTYPE_ARP:
115
	case ETHERTYPE_REVARP:
116
		arp_print(p, length, caplen);
117
		break;
118
#ifdef notyet
119
	case ETHERTYPE_DN:
120
		decnet_print(p, length, caplen);
121
		break;
122
123
	case ETHERTYPE_ATALK:
124
		if (vflag)
125
			fputs("et1 ", stdout);
126
		atalk_print(p, length);
127
		break;
128
129
	case ETHERTYPE_AARP:
130
		aarp_print(p, length);
131
		break;
132
133
	case ETHERTYPE_LAT:
134
	case ETHERTYPE_MOPRC:
135
	case ETHERTYPE_MOPDL:
136
		/* default_print for now */
137
#endif
138
	default:
139
		/* ether_type not known, print raw packet */
140
		if (!eflag)
141
			printf("%02x %02x %02x %02x-%02x-%02x %04x: ",
142
			       p[0], p[1], p[2], /* dsap/ssap/ctrl */
143
			       p[3], p[4], p[5], /* manufacturer's code */
144
			       ethertype);
145
		if (!xflag && !qflag)
146
			default_print(p, caplen);
147
	}
148
	if (xflag)
149
		default_print(p, caplen);
150
 out:
151
	putchar('\n');
152
}