GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.sbin/tcpdump/print-arp.c Lines: 0 47 0.0 %
Date: 2017-11-13 Branches: 0 29 0.0 %

Line Branch Exec Source
1
/*	$OpenBSD: print-arp.c,v 1.15 2015/11/18 15:36:20 mmcc Exp $	*/
2
3
/*
4
 * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 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
34
#include <stdio.h>
35
#include <string.h>
36
37
#include "interface.h"
38
#include "addrtoname.h"
39
#include "ethertype.h"
40
#include "extract.h"			/* must come after interface.h */
41
42
/* Compatibility */
43
#ifndef REVARP_REQUEST
44
#define REVARP_REQUEST		3
45
#endif
46
#ifndef REVARP_REPLY
47
#define REVARP_REPLY		4
48
#endif
49
50
static u_char ezero[6];
51
52
void
53
arp_print(const u_char *bp, u_int length, u_int caplen)
54
{
55
	const struct ether_arp *ap;
56
	const struct ether_header *eh;
57
	u_short pro, hrd, op;
58
59
	ap = (struct ether_arp *)bp;
60
	if ((u_char *)(ap + 1) > snapend) {
61
		printf("[|arp]");
62
		return;
63
	}
64
	if (length < sizeof(struct ether_arp)) {
65
		(void)printf("truncated-arp");
66
		default_print((u_char *)ap, length);
67
		return;
68
	}
69
70
	pro = EXTRACT_16BITS(&ap->arp_pro);
71
	hrd = EXTRACT_16BITS(&ap->arp_hrd);
72
	op = EXTRACT_16BITS(&ap->arp_op);
73
74
	if ((pro != ETHERTYPE_IP && pro != ETHERTYPE_TRAIL)
75
	    || ap->arp_hln != sizeof(SHA(ap))
76
	    || ap->arp_pln != sizeof(SPA(ap))) {
77
		(void)printf("arp-#%d for proto #%d (%d) hardware #%d (%d)",
78
				op, pro, ap->arp_pln,
79
				hrd, ap->arp_hln);
80
		return;
81
	}
82
	if (pro == ETHERTYPE_TRAIL)
83
		(void)printf("trailer-");
84
	eh = (struct ether_header *)packetp;
85
	switch (op) {
86
87
	case ARPOP_REQUEST:
88
		(void)printf("arp who-has %s", ipaddr_string(TPA(ap)));
89
		if (memcmp((char *)ezero, (char *)THA(ap), 6) != 0)
90
			(void)printf(" (%s)", etheraddr_string(THA(ap)));
91
		(void)printf(" tell %s", ipaddr_string(SPA(ap)));
92
		if (memcmp((char *)ESRC(eh), (char *)SHA(ap), 6) != 0)
93
			(void)printf(" (%s)", etheraddr_string(SHA(ap)));
94
		break;
95
96
	case ARPOP_REPLY:
97
		(void)printf("arp reply %s", ipaddr_string(SPA(ap)));
98
		if (memcmp((char *)ESRC(eh), (char *)SHA(ap), 6) != 0)
99
			(void)printf(" (%s)", etheraddr_string(SHA(ap)));
100
		(void)printf(" is-at %s", etheraddr_string(SHA(ap)));
101
		if (memcmp((char *)EDST(eh), (char *)THA(ap), 6) != 0)
102
			(void)printf(" (%s)", etheraddr_string(THA(ap)));
103
		break;
104
105
	case REVARP_REQUEST:
106
		(void)printf("rarp who-is %s tell %s",
107
			etheraddr_string(THA(ap)),
108
			etheraddr_string(SHA(ap)));
109
		break;
110
111
	case REVARP_REPLY:
112
		(void)printf("rarp reply %s at %s",
113
			etheraddr_string(THA(ap)),
114
			ipaddr_string(TPA(ap)));
115
		break;
116
117
	default:
118
		(void)printf("arp-#%d", op);
119
		default_print((u_char *)ap, caplen);
120
		return;
121
	}
122
	if (hrd != ARPHRD_ETHER)
123
		printf(" hardware #%d", hrd);
124
}