Deleted Added
full compact
route.c (97650) route.c (97878)
1/*
2 * Copyright (c) 1983, 1988, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 22 unchanged lines hidden (view full) ---

31 * SUCH DAMAGE.
32 */
33
34#ifndef lint
35#if 0
36static char sccsid[] = "From: @(#)route.c 8.6 (Berkeley) 4/28/95";
37#endif
38static const char rcsid[] =
1/*
2 * Copyright (c) 1983, 1988, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 22 unchanged lines hidden (view full) ---

31 * SUCH DAMAGE.
32 */
33
34#ifndef lint
35#if 0
36static char sccsid[] = "From: @(#)route.c 8.6 (Berkeley) 4/28/95";
37#endif
38static const char rcsid[] =
39 "$FreeBSD: head/usr.bin/netstat/route.c 97650 2002-05-31 04:36:55Z silby $";
39 "$FreeBSD: head/usr.bin/netstat/route.c 97878 2002-06-05 18:29:26Z kbyanc $";
40#endif /* not lint */
41
42#include <sys/param.h>
43#include <sys/protosw.h>
44#include <sys/socket.h>
45#include <sys/time.h>
46
47#include <net/ethernet.h>

--- 73 unchanged lines hidden (view full) ---

121struct rtentry rtentry;
122struct radix_node rnode;
123struct radix_mask rmask;
124struct radix_node_head *rt_tables[AF_MAX+1];
125
126int NewTree = 0;
127
128static struct sockaddr *kgetsa (struct sockaddr *);
40#endif /* not lint */
41
42#include <sys/param.h>
43#include <sys/protosw.h>
44#include <sys/socket.h>
45#include <sys/time.h>
46
47#include <net/ethernet.h>

--- 73 unchanged lines hidden (view full) ---

121struct rtentry rtentry;
122struct radix_node rnode;
123struct radix_mask rmask;
124struct radix_node_head *rt_tables[AF_MAX+1];
125
126int NewTree = 0;
127
128static struct sockaddr *kgetsa (struct sockaddr *);
129static void size_cols (int ef, struct radix_node *rn);
130static void size_cols_tree (struct radix_node *rn);
131static void size_cols_rtentry (struct rtentry *rt);
129static void p_tree (struct radix_node *);
130static void p_rtnode (void);
131static void ntreestuff (void);
132static void np_rtentry (struct rt_msghdr *);
133static void p_sockaddr (struct sockaddr *, struct sockaddr *, int, int);
132static void p_tree (struct radix_node *);
133static void p_rtnode (void);
134static void ntreestuff (void);
135static void np_rtentry (struct rt_msghdr *);
136static void p_sockaddr (struct sockaddr *, struct sockaddr *, int, int);
137static const char *fmt_sockaddr (struct sockaddr *sa, struct sockaddr *mask,
138 int flags);
134static void p_flags (int, char *);
139static void p_flags (int, char *);
140static const char *fmt_flags(int f);
135static void p_rtentry (struct rtentry *);
136static u_long forgemask (u_long);
137static void domask (char *, u_long, u_long);
138
139/*
140 * Print routing tables.
141 */
142void

--- 18 unchanged lines hidden (view full) ---

161 continue;
162 kget(rnh, head);
163 if (i == AF_UNSPEC) {
164 if (Aflag && af == 0) {
165 printf("Netmasks:\n");
166 p_tree(head.rnh_treetop);
167 }
168 } else if (af == AF_UNSPEC || af == i) {
141static void p_rtentry (struct rtentry *);
142static u_long forgemask (u_long);
143static void domask (char *, u_long, u_long);
144
145/*
146 * Print routing tables.
147 */
148void

--- 18 unchanged lines hidden (view full) ---

167 continue;
168 kget(rnh, head);
169 if (i == AF_UNSPEC) {
170 if (Aflag && af == 0) {
171 printf("Netmasks:\n");
172 p_tree(head.rnh_treetop);
173 }
174 } else if (af == AF_UNSPEC || af == i) {
175 size_cols(i, head.rnh_treetop);
169 pr_family(i);
170 do_rtent = 1;
171 pr_rthdr(i);
172 p_tree(head.rnh_treetop);
173 }
174 }
175 }
176}

--- 42 unchanged lines hidden (view full) ---

219 if (afname)
220 printf("\n%s:\n", afname);
221 else
222 printf("\nProtocol Family %d:\n", af);
223}
224
225/* column widths; each followed by one space */
226#ifndef INET6
176 pr_family(i);
177 do_rtent = 1;
178 pr_rthdr(i);
179 p_tree(head.rnh_treetop);
180 }
181 }
182 }
183}

--- 42 unchanged lines hidden (view full) ---

226 if (afname)
227 printf("\n%s:\n", afname);
228 else
229 printf("\nProtocol Family %d:\n", af);
230}
231
232/* column widths; each followed by one space */
233#ifndef INET6
227#define WID_DST(af) 18 /* width of destination column */
228#define WID_GW(af) 18 /* width of gateway column */
229#define WID_IF(af) 6 /* width of netif column */
234#define WID_DST_DEFAULT(af) 18 /* width of destination column */
235#define WID_GW_DEFAULT(af) 18 /* width of gateway column */
236#define WID_IF_DEFAULT(af) 6 /* width of netif column */
230#else
237#else
231#define WID_DST(af) \
232 ((af) == AF_INET6 ? (Wflag ? 39 : (numeric_addr ? 33: 18)) : 18)
233#define WID_GW(af) \
234 ((af) == AF_INET6 ? (Wflag ? 31 : (numeric_addr ? 29 : 18)) : 18)
235#define WID_IF(af) ((af) == AF_INET6 ? 8 : 6)
238#define WID_DST_DEFAULT(af) \
239 ((af) == AF_INET6 ? (numeric_addr ? 33: 18) : 18)
240#define WID_GW_DEFAULT(af) \
241 ((af) == AF_INET6 ? (numeric_addr ? 29 : 18) : 18)
242#define WID_IF_DEFAULT(af) ((af) == AF_INET6 ? 8 : 6)
236#endif /*INET6*/
237
243#endif /*INET6*/
244
245static int wid_dst;
246static int wid_gw;
247static int wid_flags;
248static int wid_refs;
249static int wid_use;
250static int wid_mtu;
251static int wid_if;
252static int wid_expire;
253
254static void
255size_cols(int ef, struct radix_node *rn)
256{
257 wid_dst = WID_DST_DEFAULT(ef);
258 wid_gw = WID_GW_DEFAULT(ef);
259 wid_flags = 6;
260 wid_refs = 6;
261 wid_use = 8;
262 wid_mtu = 6;
263 wid_if = WID_IF_DEFAULT(ef);
264 wid_expire = 6;
265
266 if (Wflag)
267 size_cols_tree(rn);
268}
269
270static void
271size_cols_tree(struct radix_node *rn)
272{
273again:
274 kget(rn, rnode);
275 if (rnode.rn_bit < 0) {
276 if ((rnode.rn_flags & RNF_ROOT) == 0) {
277 kget(rn, rtentry);
278 size_cols_rtentry(&rtentry);
279 }
280 if ((rn = rnode.rn_dupedkey))
281 goto again;
282 } else {
283 rn = rnode.rn_right;
284 size_cols_tree(rnode.rn_left);
285 size_cols_tree(rn);
286 }
287}
288
289static void
290size_cols_rtentry(struct rtentry *rt)
291{
292 static struct ifnet ifnet, *lastif;
293 struct rtentry parent;
294 static char buffer[100];
295 const char *bp;
296 struct sockaddr *sa;
297 sa_u addr, mask;
298 int len;
299
300 /*
301 * Don't print protocol-cloned routes unless -a.
302 */
303 if (rt->rt_flags & RTF_WASCLONED && !aflag) {
304 kget(rt->rt_parent, parent);
305 if (parent.rt_flags & RTF_PRCLONING)
306 return;
307 }
308
309 bzero(&addr, sizeof(addr));
310 if ((sa = kgetsa(rt_key(rt))))
311 bcopy(sa, &addr, sa->sa_len);
312 bzero(&mask, sizeof(mask));
313 if (rt_mask(rt) && (sa = kgetsa(rt_mask(rt))))
314 bcopy(sa, &mask, sa->sa_len);
315 bp = fmt_sockaddr(&addr.u_sa, &mask.u_sa, rt->rt_flags);
316 len = strlen(bp);
317 wid_dst = MAX(len, wid_dst);
318
319 bp = fmt_sockaddr(kgetsa(rt->rt_gateway), NULL, RTF_HOST);
320 len = strlen(bp);
321 wid_gw = MAX(len, wid_gw);
322
323 bp = fmt_flags(rt->rt_flags);
324 len = strlen(bp);
325 wid_flags = MAX(len, wid_flags);
326
327 if (addr.u_sa.sa_family == AF_INET || Wflag) {
328 len = snprintf(buffer, sizeof(buffer), "%ld", rt->rt_refcnt);
329 wid_refs = MAX(len, wid_refs);
330 len = snprintf(buffer, sizeof(buffer), "%lu", rt->rt_use);
331 wid_use = MAX(len, wid_use);
332 if (Wflag && rt->rt_rmx.rmx_mtu != 0) {
333 len = snprintf(buffer, sizeof(buffer),
334 "%lu", rt->rt_rmx.rmx_mtu);
335 wid_mtu = MAX(len, wid_mtu);
336 }
337 }
338 if (rt->rt_ifp) {
339 if (rt->rt_ifp != lastif) {
340 len = snprintf(buffer, sizeof(buffer), "%d",
341 ifnet.if_unit);
342 kget(rt->rt_ifp, ifnet);
343 kread((u_long)ifnet.if_name, buffer, sizeof(buffer));
344 lastif = rt->rt_ifp;
345 len += strlen(buffer);
346 wid_if = MAX(len, wid_if);
347 }
348 if (rt->rt_rmx.rmx_expire) {
349 time_t expire_time;
350
351 if ((expire_time =
352 rt->rt_rmx.rmx_expire - time(NULL)) > 0) {
353 len = snprintf(buffer, sizeof(buffer), "%d",
354 (int)expire_time);
355 wid_expire = MAX(len, wid_expire);
356 }
357 }
358 }
359}
360
361
238/*
239 * Print header for routing table columns.
240 */
241void
242pr_rthdr(int af)
243{
244
245 if (Aflag)
246 printf("%-8.8s ","Address");
362/*
363 * Print header for routing table columns.
364 */
365void
366pr_rthdr(int af)
367{
368
369 if (Aflag)
370 printf("%-8.8s ","Address");
247 if (af == AF_INET || Wflag)
248 if (Wflag)
249 printf("%-*.*s %-*.*s %-6.6s %6.6s %8.8s %6.6s %*.*s %6s\n",
250 WID_DST(af), WID_DST(af), "Destination",
251 WID_GW(af), WID_GW(af), "Gateway",
252 "Flags", "Refs", "Use", "Mtu",
253 WID_IF(af), WID_IF(af), "Netif", "Expire");
254 else
255 printf("%-*.*s %-*.*s %-6.6s %6.6s %8.8s %*.*s %6s\n",
256 WID_DST(af), WID_DST(af), "Destination",
257 WID_GW(af), WID_GW(af), "Gateway",
258 "Flags", "Refs", "Use",
259 WID_IF(af), WID_IF(af), "Netif", "Expire");
260 else
261 printf("%-*.*s %-*.*s %-6.6s %8.8s %6s\n",
262 WID_DST(af), WID_DST(af), "Destination",
263 WID_GW(af), WID_GW(af), "Gateway",
264 "Flags", "Netif", "Expire");
371 if (af == AF_INET || Wflag) {
372 if (Wflag) {
373 printf("%-*.*s %-*.*s %-*.*s %*.*s %*.*s %*.*s %*.*s %*s\n",
374 wid_dst, wid_dst, "Destination",
375 wid_gw, wid_gw, "Gateway",
376 wid_flags, wid_flags, "Flags",
377 wid_refs, wid_refs, "Refs",
378 wid_use, wid_use, "Use",
379 wid_mtu, wid_mtu, "Mtu",
380 wid_if, wid_if, "Netif",
381 wid_expire, "Expire");
382 } else {
383 printf("%-*.*s %-*.*s %-*.*s %*.*s %*.*s %*.*s %*s\n",
384 wid_dst, wid_dst, "Destination",
385 wid_gw, wid_gw, "Gateway",
386 wid_flags, wid_flags, "Flags",
387 wid_refs, wid_refs, "Refs",
388 wid_use, wid_use, "Use",
389 wid_if, wid_if, "Netif",
390 wid_expire, "Expire");
391 }
392 } else {
393 printf("%-*.*s %-*.*s %-*.*s %*.*s %*s\n",
394 wid_dst, wid_dst, "Destination",
395 wid_gw, wid_gw, "Gateway",
396 wid_flags, wid_flags, "Flags",
397 wid_if, wid_if, "Netif",
398 wid_expire, "Expire");
399 }
265}
266
267static struct sockaddr *
268kgetsa(struct sockaddr *dst)
269{
270
271 kget(dst, pt_u.u_sa);
272 if (pt_u.u_sa.sa_len > sizeof (pt_u.u_sa))

--- 144 unchanged lines hidden (view full) ---

417 }
418 p_flags(rtm->rtm_flags & interesting, "%-6.6s ");
419 putchar('\n');
420}
421
422static void
423p_sockaddr(struct sockaddr *sa, struct sockaddr *mask, int flags, int width)
424{
400}
401
402static struct sockaddr *
403kgetsa(struct sockaddr *dst)
404{
405
406 kget(dst, pt_u.u_sa);
407 if (pt_u.u_sa.sa_len > sizeof (pt_u.u_sa))

--- 144 unchanged lines hidden (view full) ---

552 }
553 p_flags(rtm->rtm_flags & interesting, "%-6.6s ");
554 putchar('\n');
555}
556
557static void
558p_sockaddr(struct sockaddr *sa, struct sockaddr *mask, int flags, int width)
559{
425 char workbuf[128], *cplim;
426 register char *cp = workbuf;
560 const char *cp;
427
561
562 cp = fmt_sockaddr(sa, mask, flags);
563
564 if (width < 0 )
565 printf("%s ", cp);
566 else {
567 if (numeric_addr)
568 printf("%-*s ", width, cp);
569 else
570 printf("%-*.*s ", width, width, cp);
571 }
572}
573
574static const char *
575fmt_sockaddr(struct sockaddr *sa, struct sockaddr *mask, int flags)
576{
577 static char workbuf[128];
578 char *cplim;
579 char *cp = workbuf;
580
428 switch(sa->sa_family) {
429 case AF_INET:
430 {
431 register struct sockaddr_in *sin = (struct sockaddr_in *)sa;
432
433 if ((sin->sin_addr.s_addr == INADDR_ANY) &&
434 mask &&
435 ntohl(((struct sockaddr_in *)mask)->sin_addr.s_addr)

--- 101 unchanged lines hidden (view full) ---

537 while (s < slim && cp < cplim) {
538 cp += sprintf(cp, " %02x", *s++);
539 if (s < slim)
540 cp += sprintf(cp, "%02x", *s++);
541 }
542 cp = workbuf;
543 }
544 }
581 switch(sa->sa_family) {
582 case AF_INET:
583 {
584 register struct sockaddr_in *sin = (struct sockaddr_in *)sa;
585
586 if ((sin->sin_addr.s_addr == INADDR_ANY) &&
587 mask &&
588 ntohl(((struct sockaddr_in *)mask)->sin_addr.s_addr)

--- 101 unchanged lines hidden (view full) ---

690 while (s < slim && cp < cplim) {
691 cp += sprintf(cp, " %02x", *s++);
692 if (s < slim)
693 cp += sprintf(cp, "%02x", *s++);
694 }
695 cp = workbuf;
696 }
697 }
545 if (width < 0 )
546 printf("%s ", cp);
547 else {
548 if (numeric_addr)
549 printf("%-*s ", width, cp);
550 else
551 printf("%-*.*s ", width, width, cp);
552 }
698
699 return (cp);
553}
554
555static void
556p_flags(int f, char *format)
557{
700}
701
702static void
703p_flags(int f, char *format)
704{
558 char name[33], *flags;
559 register struct bits *p = bits;
705 printf(format, fmt_flags(f));
706}
560
707
708static const char *
709fmt_flags(int f)
710{
711 static char name[33];
712 char *flags;
713 struct bits *p = bits;
714
561 for (flags = name; p->b_mask; p++)
562 if (p->b_mask & f)
563 *flags++ = p->b_val;
564 *flags = '\0';
715 for (flags = name; p->b_mask; p++)
716 if (p->b_mask & f)
717 *flags++ = p->b_val;
718 *flags = '\0';
565 printf(format, name);
719 return (name);
566}
567
568static void
569p_rtentry(struct rtentry *rt)
570{
571 static struct ifnet ifnet, *lastif;
572 struct rtentry parent;
720}
721
722static void
723p_rtentry(struct rtentry *rt)
724{
725 static struct ifnet ifnet, *lastif;
726 struct rtentry parent;
573 static char name[16];
574 static char prettyname[9];
727 static char buffer[128];
728 static char prettyname[128];
575 struct sockaddr *sa;
576 sa_u addr, mask;
577
578 /*
579 * Don't print protocol-cloned routes unless -a.
580 */
581 if (rt->rt_flags & RTF_WASCLONED && !aflag) {
582 kget(rt->rt_parent, parent);
583 if (parent.rt_flags & RTF_PRCLONING)
584 return;
585 }
586
587 bzero(&addr, sizeof(addr));
588 if ((sa = kgetsa(rt_key(rt))))
589 bcopy(sa, &addr, sa->sa_len);
590 bzero(&mask, sizeof(mask));
591 if (rt_mask(rt) && (sa = kgetsa(rt_mask(rt))))
592 bcopy(sa, &mask, sa->sa_len);
729 struct sockaddr *sa;
730 sa_u addr, mask;
731
732 /*
733 * Don't print protocol-cloned routes unless -a.
734 */
735 if (rt->rt_flags & RTF_WASCLONED && !aflag) {
736 kget(rt->rt_parent, parent);
737 if (parent.rt_flags & RTF_PRCLONING)
738 return;
739 }
740
741 bzero(&addr, sizeof(addr));
742 if ((sa = kgetsa(rt_key(rt))))
743 bcopy(sa, &addr, sa->sa_len);
744 bzero(&mask, sizeof(mask));
745 if (rt_mask(rt) && (sa = kgetsa(rt_mask(rt))))
746 bcopy(sa, &mask, sa->sa_len);
593 p_sockaddr(&addr.u_sa, &mask.u_sa, rt->rt_flags,
594 WID_DST(addr.u_sa.sa_family));
595 p_sockaddr(kgetsa(rt->rt_gateway), NULL, RTF_HOST,
596 WID_GW(addr.u_sa.sa_family));
597 p_flags(rt->rt_flags, "%-6.6s ");
747 p_sockaddr(&addr.u_sa, &mask.u_sa, rt->rt_flags, wid_dst);
748 p_sockaddr(kgetsa(rt->rt_gateway), NULL, RTF_HOST, wid_gw);
749 snprintf(buffer, sizeof(buffer), "%%-%d.%ds ", wid_flags, wid_flags);
750 p_flags(rt->rt_flags, buffer);
598 if (addr.u_sa.sa_family == AF_INET || Wflag) {
751 if (addr.u_sa.sa_family == AF_INET || Wflag) {
599 printf("%6ld %8lu ", rt->rt_refcnt, rt->rt_use);
752 printf("%*ld %*lu ", wid_refs, rt->rt_refcnt,
753 wid_use, rt->rt_use);
600 if (Wflag) {
601 if (rt->rt_rmx.rmx_mtu != 0)
754 if (Wflag) {
755 if (rt->rt_rmx.rmx_mtu != 0)
602 printf("%6lu ", rt->rt_rmx.rmx_mtu);
756 printf("%*lu ", wid_mtu, rt->rt_rmx.rmx_mtu);
603 else
757 else
604 printf("%6s ", "");
758 printf("%*s ", wid_mtu, "");
605 }
606 }
607 if (rt->rt_ifp) {
608 if (rt->rt_ifp != lastif) {
609 kget(rt->rt_ifp, ifnet);
759 }
760 }
761 if (rt->rt_ifp) {
762 if (rt->rt_ifp != lastif) {
763 kget(rt->rt_ifp, ifnet);
610 kread((u_long)ifnet.if_name, name, 16);
764 kread((u_long)ifnet.if_name, buffer, sizeof(buffer));
611 lastif = rt->rt_ifp;
765 lastif = rt->rt_ifp;
612 snprintf(prettyname, sizeof prettyname,
613 "%s%d", name, ifnet.if_unit);
766 snprintf(prettyname, sizeof(prettyname),
767 "%s%d", buffer, ifnet.if_unit);
614 }
768 }
615 printf("%*.*s", WID_IF(addr.u_sa.sa_family),
616 WID_IF(addr.u_sa.sa_family), prettyname);
769 printf("%*.*s", wid_if, wid_if, prettyname);
617 if (rt->rt_rmx.rmx_expire) {
618 time_t expire_time;
619
620 if ((expire_time =
621 rt->rt_rmx.rmx_expire - time((time_t *)0)) > 0)
770 if (rt->rt_rmx.rmx_expire) {
771 time_t expire_time;
772
773 if ((expire_time =
774 rt->rt_rmx.rmx_expire - time((time_t *)0)) > 0)
622 printf(" %6d", (int)expire_time);
775 printf(" %*d", wid_expire, (int)expire_time);
623 }
624 if (rt->rt_nodes[0].rn_dupedkey)
625 printf(" =>");
626 }
627 putchar('\n');
628}
629
630char *

--- 431 unchanged lines hidden ---
776 }
777 if (rt->rt_nodes[0].rn_dupedkey)
778 printf(" =>");
779 }
780 putchar('\n');
781}
782
783char *

--- 431 unchanged lines hidden ---