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

Line Branch Exec Source
1
/*	$OpenBSD: print-igrp.c,v 1.8 2015/11/16 00:16:39 mmcc Exp $	*/
2
3
/*
4
 * Copyright (c) 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
 * Initial contribution from Francis Dupont (francis.dupont@inria.fr)
24
 */
25
26
#include <sys/types.h>			/* concession to AIX */
27
#include <sys/socket.h>
28
29
#include <netinet/in.h>
30
#include <netinet/ip.h>
31
#include <netinet/ip_var.h>
32
#include <netinet/udp.h>
33
#include <netinet/udp_var.h>
34
35
#include <errno.h>
36
#include <stdio.h>
37
38
#include "interface.h"
39
#include "addrtoname.h"
40
#include "igrp.h"
41
#include "extract.h"			/* must come after interface.h */
42
43
static void
44
igrp_entry_print(struct igrprte *igr, int is_interior, int is_exterior)
45
{
46
	u_int delay, bandwidth;
47
	u_int metric, mtu;
48
49
	if (is_interior)
50
		printf(" *.%d.%d.%d", igr->igr_net[0],
51
		    igr->igr_net[1], igr->igr_net[2]);
52
	else if (is_exterior)
53
		printf(" X%d.%d.%d.0", igr->igr_net[0],
54
		    igr->igr_net[1], igr->igr_net[2]);
55
	else
56
		printf(" %d.%d.%d.0", igr->igr_net[0],
57
		    igr->igr_net[1], igr->igr_net[2]);
58
59
	delay = EXTRACT_24BITS(igr->igr_dly);
60
	bandwidth = EXTRACT_24BITS(igr->igr_bw);
61
	metric = bandwidth + delay;
62
	if (metric > 0xffffff)
63
		metric = 0xffffff;
64
	mtu = EXTRACT_16BITS(igr->igr_mtu);
65
66
	printf(" d=%d b=%d r=%d l=%d M=%d mtu=%d in %d hops",
67
	    10 * delay, bandwidth == 0 ? 0 : 10000000 / bandwidth,
68
	    igr->igr_rel, igr->igr_ld, metric,
69
	    mtu, igr->igr_hct);
70
}
71
72
static struct tok op2str[] = {
73
	{ IGRP_UPDATE,		"update" },
74
	{ IGRP_REQUEST,		"request" },
75
	{ 0,			NULL }
76
};
77
78
void
79
igrp_print(const u_char *bp, u_int length, const u_char *bp2)
80
{
81
	struct igrphdr *hdr;
82
	struct ip *ip;
83
	u_char *cp;
84
	u_int nint, nsys, next;
85
86
	hdr = (struct igrphdr *)bp;
87
	ip = (struct ip *)bp2;
88
	cp = (u_char *)(hdr + 1);
89
        (void)printf("%s > %s: igrp: ",
90
	    ipaddr_string(&ip->ip_src),
91
	    ipaddr_string(&ip->ip_dst));
92
93
	/* Header */
94
	TCHECK(*hdr);
95
	nint = EXTRACT_16BITS(&hdr->ig_ni);
96
	nsys = EXTRACT_16BITS(&hdr->ig_ns);
97
	next = EXTRACT_16BITS(&hdr->ig_nx);
98
99
	(void)printf(" %s V%d edit=%d AS=%d (%d/%d/%d)",
100
	    tok2str(op2str, "op-#%d", hdr->ig_op),
101
	    hdr->ig_v,
102
	    hdr->ig_ed,
103
	    EXTRACT_16BITS(&hdr->ig_as),
104
	    nint,
105
	    nsys,
106
	    next);
107
108
	length -= sizeof(*hdr);
109
	while (length >= IGRP_RTE_SIZE) {
110
		if (nint > 0) {
111
			TCHECK2(*cp, IGRP_RTE_SIZE);
112
			igrp_entry_print((struct igrprte *)cp, 1, 0);
113
			--nint;
114
		} else if (nsys > 0) {
115
			TCHECK2(*cp, IGRP_RTE_SIZE);
116
			igrp_entry_print((struct igrprte *)cp, 0, 0);
117
			--nsys;
118
		} else if (next > 0) {
119
			TCHECK2(*cp, IGRP_RTE_SIZE);
120
			igrp_entry_print((struct igrprte *)cp, 0, 1);
121
			--next;
122
		} else {
123
			(void)printf("[extra bytes %d]", length);
124
			break;
125
		}
126
		cp += IGRP_RTE_SIZE;
127
		length -= IGRP_RTE_SIZE;
128
	}
129
	if (nint == 0 && nsys == 0 && next == 0)
130
		return;
131
trunc:
132
	fputs("[|igrp]", stdout);
133
}