Deleted Added
full compact
route.c (12632) route.c (13430)
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

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

28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34#ifndef lint
35#if 0
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

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

28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34#ifndef lint
35#if 0
36static char sccsid[] = "From: @(#)route.c 8.3 (Berkeley) 3/9/94";
36static char sccsid[] = "From: @(#)route.c 8.6 (Berkeley) 4/28/95";
37#endif
38static const char rcsid[] =
37#endif
38static const char rcsid[] =
39 "$Id: route.c,v 1.7 1995/10/26 20:31:59 julian Exp $";
39 "$Id: route.c,v 1.8 1995/12/05 07:29:15 julian Exp $";
40#endif /* not lint */
41
42#include <sys/param.h>
43#include <sys/protosw.h>
44#include <sys/socket.h>
45#include <sys/mbuf.h>
46
47#include <net/if.h>

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

109
110int NewTree = 0;
111
112static struct sockaddr *kgetsa __P((struct sockaddr *));
113static void p_tree __P((struct radix_node *));
114static void p_rtnode __P(());
115static void ntreestuff __P(());
116static void np_rtentry __P((struct rt_msghdr *));
40#endif /* not lint */
41
42#include <sys/param.h>
43#include <sys/protosw.h>
44#include <sys/socket.h>
45#include <sys/mbuf.h>
46
47#include <net/if.h>

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

109
110int NewTree = 0;
111
112static struct sockaddr *kgetsa __P((struct sockaddr *));
113static void p_tree __P((struct radix_node *));
114static void p_rtnode __P(());
115static void ntreestuff __P(());
116static void np_rtentry __P((struct rt_msghdr *));
117static void p_sockaddr __P((struct sockaddr *, int, int));
117static void p_sockaddr __P((struct sockaddr *, struct sockaddr *, int, int));
118static void p_flags __P((int, char *));
119static void p_rtentry __P((struct rtentry *));
120
121/*
122 * Print routing tables.
123 */
124void
125routepr(rtree)

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

189 }
190 if (afname)
191 printf("\n%s:\n", afname);
192 else
193 printf("\nProtocol Family %d:\n", af);
194}
195
196/* column widths; each followed by one space */
118static void p_flags __P((int, char *));
119static void p_rtentry __P((struct rtentry *));
120
121/*
122 * Print routing tables.
123 */
124void
125routepr(rtree)

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

189 }
190 if (afname)
191 printf("\n%s:\n", afname);
192 else
193 printf("\nProtocol Family %d:\n", af);
194}
195
196/* column widths; each followed by one space */
197#define WID_DST 16 /* width of destination column */
197#define WID_DST 18 /* width of destination column */
198#define WID_GW 18 /* width of gateway column */
199
200/*
201 * Print header for routing table columns.
202 */
203void
204pr_rthdr()
205{

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

238 rnode.rn_dupedkey ? " =>\n" : "\n");
239 } else if (do_rtent) {
240 kget(rn, rtentry);
241 p_rtentry(&rtentry);
242 if (Aflag)
243 p_rtnode();
244 } else {
245 p_sockaddr(kgetsa((struct sockaddr *)rnode.rn_key),
198#define WID_GW 18 /* width of gateway column */
199
200/*
201 * Print header for routing table columns.
202 */
203void
204pr_rthdr()
205{

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

238 rnode.rn_dupedkey ? " =>\n" : "\n");
239 } else if (do_rtent) {
240 kget(rn, rtentry);
241 p_rtentry(&rtentry);
242 if (Aflag)
243 p_rtnode();
244 } else {
245 p_sockaddr(kgetsa((struct sockaddr *)rnode.rn_key),
246 0, 44);
246 NULL, 0, 44);
247 putchar('\n');
248 }
249 if (rn = rnode.rn_dupedkey)
250 goto again;
251 } else {
252 if (Aflag && do_rtent) {
253 printf("%-8.8x ", rn);
254 p_rtnode();

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

265p_rtnode()
266{
267 struct radix_mask *rm = rnode.rn_mklist;
268
269 if (rnode.rn_b < 0) {
270 if (rnode.rn_mask) {
271 printf("\t mask ");
272 p_sockaddr(kgetsa((struct sockaddr *)rnode.rn_mask),
247 putchar('\n');
248 }
249 if (rn = rnode.rn_dupedkey)
250 goto again;
251 } else {
252 if (Aflag && do_rtent) {
253 printf("%-8.8x ", rn);
254 p_rtnode();

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

265p_rtnode()
266{
267 struct radix_mask *rm = rnode.rn_mklist;
268
269 if (rnode.rn_b < 0) {
270 if (rnode.rn_mask) {
271 printf("\t mask ");
272 p_sockaddr(kgetsa((struct sockaddr *)rnode.rn_mask),
273 0, -1);
273 NULL, 0, -1);
274 } else if (rm == 0)
275 return;
276 } else {
277 sprintf(nbuf, "(%d)", rnode.rn_b);
278 printf("%6.6s %8.8x : %8.8x", nbuf, rnode.rn_l, rnode.rn_r);
279 }
280 while (rm) {
281 kget(rm, rmask);
282 sprintf(nbuf, " %d refs, ", rmask.rm_refs);
283 printf(" mk = %8.8x {(%d),%s",
284 rm, -1 - rmask.rm_b, rmask.rm_refs ? nbuf : " ");
274 } else if (rm == 0)
275 return;
276 } else {
277 sprintf(nbuf, "(%d)", rnode.rn_b);
278 printf("%6.6s %8.8x : %8.8x", nbuf, rnode.rn_l, rnode.rn_r);
279 }
280 while (rm) {
281 kget(rm, rmask);
282 sprintf(nbuf, " %d refs, ", rmask.rm_refs);
283 printf(" mk = %8.8x {(%d),%s",
284 rm, -1 - rmask.rm_b, rmask.rm_refs ? nbuf : " ");
285 p_sockaddr(kgetsa((struct sockaddr *)rmask.rm_mask), 0, -1);
285 if (rmask.rm_flags & RNF_NORMAL) {
286 struct radix_node rnode_aux;
287 printf(" <normal>, ");
288 kget(rmask.rm_leaf, rnode_aux);
289 p_sockaddr(kgetsa((struct sockaddr *)rnode_aux.rn_mask),
290 NULL, 0, -1);
291 } else
292 p_sockaddr(kgetsa((struct sockaddr *)rmask.rm_mask),
293 NULL, 0, -1);
286 putchar('}');
287 if (rm = rmask.rm_mklist)
288 printf(" ->");
289 }
290 putchar('\n');
291}
292
293static void

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

346 } else
347#endif
348 af = sa->sa_family;
349 if (af != old_af) {
350 pr_family(af);
351 old_af = af;
352 }
353 if (rtm->rtm_addrs == RTA_DST)
294 putchar('}');
295 if (rm = rmask.rm_mklist)
296 printf(" ->");
297 }
298 putchar('\n');
299}
300
301static void

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

354 } else
355#endif
356 af = sa->sa_family;
357 if (af != old_af) {
358 pr_family(af);
359 old_af = af;
360 }
361 if (rtm->rtm_addrs == RTA_DST)
354 p_sockaddr(sa, 0, 36);
362 p_sockaddr(sa, NULL, 0, 36);
355 else {
363 else {
356 p_sockaddr(sa, rtm->rtm_flags, 16);
364 p_sockaddr(sa, NULL, rtm->rtm_flags, 16);
357 if (sa->sa_len == 0)
358 sa->sa_len = sizeof(long);
359 sa = (struct sockaddr *)(sa->sa_len + (char *)sa);
365 if (sa->sa_len == 0)
366 sa->sa_len = sizeof(long);
367 sa = (struct sockaddr *)(sa->sa_len + (char *)sa);
360 p_sockaddr(sa, 0, 18);
368 p_sockaddr(sa, NULL, 0, 18);
361 }
362 p_flags(rtm->rtm_flags & interesting, "%-6.6s ");
363 putchar('\n');
364}
365
366static void
369 }
370 p_flags(rtm->rtm_flags & interesting, "%-6.6s ");
371 putchar('\n');
372}
373
374static void
367p_sockaddr(sa, flags, width)
368 struct sockaddr *sa;
375p_sockaddr(sa, mask, flags, width)
376 struct sockaddr *sa, *mask;
369 int flags, width;
370{
371 char workbuf[128], *cplim;
372 register char *cp = workbuf;
373
374 switch(sa->sa_family) {
375 case AF_INET:
376 {
377 register struct sockaddr_in *sin = (struct sockaddr_in *)sa;
378
377 int flags, width;
378{
379 char workbuf[128], *cplim;
380 register char *cp = workbuf;
381
382 switch(sa->sa_family) {
383 case AF_INET:
384 {
385 register struct sockaddr_in *sin = (struct sockaddr_in *)sa;
386
379 cp = (sin->sin_addr.s_addr == 0) ? "default" :
380 ((flags & RTF_HOST) ?
381 routename(sin->sin_addr.s_addr) :
382 netname(sin->sin_addr.s_addr, 0L));
387 if (sin->sin_addr.s_addr == INADDR_ANY)
388 cp = "default";
389 else if (flags & RTF_HOST)
390 cp = routename(sin->sin_addr.s_addr);
391 else if (mask)
392 cp = netname(sin->sin_addr.s_addr,
393 ntohl(((struct sockaddr_in *)mask)
394 ->sin_addr.s_addr));
395 else
396 cp = netname(sin->sin_addr.s_addr, 0L);
383 break;
384 }
385
386 case AF_IPX:
387 {
388 struct ipx_addr work = ((struct sockaddr_ipx *)sa)->sipx_addr;
389 if (ipx_nullnet(satoipx_addr(work)))
390 cp = "default";

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

468
469static void
470p_rtentry(rt)
471 register struct rtentry *rt;
472{
473 static struct ifnet ifnet, *lastif;
474 static char name[16];
475 static char prettyname[9];
397 break;
398 }
399
400 case AF_IPX:
401 {
402 struct ipx_addr work = ((struct sockaddr_ipx *)sa)->sipx_addr;
403 if (ipx_nullnet(satoipx_addr(work)))
404 cp = "default";

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

482
483static void
484p_rtentry(rt)
485 register struct rtentry *rt;
486{
487 static struct ifnet ifnet, *lastif;
488 static char name[16];
489 static char prettyname[9];
490 struct sockaddr *sa;
491 struct sockaddr addr, mask;
476
477 /*
478 * Don't print protocol-cloned routes unless -a.
479 */
480 if(rt->rt_parent && !aflag)
481 return;
482
492
493 /*
494 * Don't print protocol-cloned routes unless -a.
495 */
496 if(rt->rt_parent && !aflag)
497 return;
498
483 p_sockaddr(kgetsa(rt_key(rt)), rt->rt_flags, WID_DST);
484 p_sockaddr(kgetsa(rt->rt_gateway), RTF_HOST, WID_GW);
499 if (!(sa = kgetsa(rt_key(rt))))
500 bzero(&addr, sizeof addr);
501 else
502 addr = *sa;
503 if (!rt_mask(rt) || !(sa = kgetsa(rt_mask(rt))))
504 bzero(&mask, sizeof mask);
505 else
506 mask = *sa;
507 p_sockaddr(&addr, &mask, rt->rt_flags, WID_DST);
508 p_sockaddr(kgetsa(rt->rt_gateway), NULL, RTF_HOST, WID_GW);
485 p_flags(rt->rt_flags, "%-6.6s ");
486 printf("%6d %8d ", rt->rt_refcnt, rt->rt_use);
487 if (rt->rt_ifp) {
488 if (rt->rt_ifp != lastif) {
489 kget(rt->rt_ifp, ifnet);
490 kread((u_long)ifnet.if_name, name, 16);
491 lastif = rt->rt_ifp;
492 snprintf(prettyname, sizeof prettyname,

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

544#define C(x) ((x) & 0xff)
545 in = ntohl(in);
546 sprintf(line, "%u.%u.%u.%u",
547 C(in >> 24), C(in >> 16), C(in >> 8), C(in));
548 }
549 return (line);
550}
551
509 p_flags(rt->rt_flags, "%-6.6s ");
510 printf("%6d %8d ", rt->rt_refcnt, rt->rt_use);
511 if (rt->rt_ifp) {
512 if (rt->rt_ifp != lastif) {
513 kget(rt->rt_ifp, ifnet);
514 kread((u_long)ifnet.if_name, name, 16);
515 lastif = rt->rt_ifp;
516 snprintf(prettyname, sizeof prettyname,

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

568#define C(x) ((x) & 0xff)
569 in = ntohl(in);
570 sprintf(line, "%u.%u.%u.%u",
571 C(in >> 24), C(in >> 16), C(in >> 8), C(in));
572 }
573 return (line);
574}
575
576static u_long
577forgemask(a)
578 u_long a;
579{
580 u_long m;
581
582 if (IN_CLASSA(a))
583 m = IN_CLASSA_NET;
584 else if (IN_CLASSB(a))
585 m = IN_CLASSB_NET;
586 else
587 m = IN_CLASSC_NET;
588 return (m);
589}
590
591static void
592domask(dst, addr, mask)
593 char *dst;
594 u_long addr, mask;
595{
596 register int b, i;
597
598 if (!mask || (forgemask(addr) == mask)) {
599 *dst = '\0';
600 return;
601 }
602 i = 0;
603 for (b = 0; b < 32; b++)
604 if (mask & (1 << b)) {
605 register int bb;
606
607 i = b;
608 for (bb = b+1; bb < 32; bb++)
609 if (!(mask & (1 << bb))) {
610 i = -1; /* noncontig */
611 break;
612 }
613 break;
614 }
615 if (i == -1)
616 sprintf(dst, "&0x%lx", mask);
617 else
618 sprintf(dst, "/%d", 32-i);
619}
620
552/*
553 * Return the name of the network whose address is given.
554 * The address is assumed to be that of a net or subnet, not a host.
555 */
556char *
557netname(in, mask)
558 u_long in, mask;
559{
560 char *cp = 0;
561 static char line[MAXHOSTNAMELEN + 1];
562 struct netent *np = 0;
621/*
622 * Return the name of the network whose address is given.
623 * The address is assumed to be that of a net or subnet, not a host.
624 */
625char *
626netname(in, mask)
627 u_long in, mask;
628{
629 char *cp = 0;
630 static char line[MAXHOSTNAMELEN + 1];
631 struct netent *np = 0;
563 u_long net;
564 register int i;
632 u_long net, omask;
633 register u_long i;
565 int subnetshift;
566
567 i = ntohl(in);
634 int subnetshift;
635
636 i = ntohl(in);
637 omask = mask;
568 if (!nflag && i) {
569 if (mask == 0) {
638 if (!nflag && i) {
639 if (mask == 0) {
570 if (IN_CLASSA(i)) {
571 mask = IN_CLASSA_NET;
640 switch (mask = forgemask(i)) {
641 case IN_CLASSA_NET:
572 subnetshift = 8;
642 subnetshift = 8;
573 } else if (IN_CLASSB(i)) {
574 mask = IN_CLASSB_NET;
643 break;
644 case IN_CLASSB_NET:
575 subnetshift = 8;
645 subnetshift = 8;
576 } else {
577 mask = IN_CLASSC_NET;
646 break;
647 case IN_CLASSC_NET:
578 subnetshift = 4;
648 subnetshift = 4;
649 break;
650 default:
651 abort();
579 }
580 /*
581 * If there are more bits than the standard mask
582 * would suggest, subnets must be in use.
583 * Guess at the subnet mask, assuming reasonable
584 * width subnet fields.
585 */
586 while (i &~ mask)

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

600 sprintf(line, "%u", C(i >> 24));
601 else if ((i & 0xffff) == 0)
602 sprintf(line, "%u.%u", C(i >> 24) , C(i >> 16));
603 else if ((i & 0xff) == 0)
604 sprintf(line, "%u.%u.%u", C(i >> 24), C(i >> 16), C(i >> 8));
605 else
606 sprintf(line, "%u.%u.%u.%u", C(i >> 24),
607 C(i >> 16), C(i >> 8), C(i));
652 }
653 /*
654 * If there are more bits than the standard mask
655 * would suggest, subnets must be in use.
656 * Guess at the subnet mask, assuming reasonable
657 * width subnet fields.
658 */
659 while (i &~ mask)

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

673 sprintf(line, "%u", C(i >> 24));
674 else if ((i & 0xffff) == 0)
675 sprintf(line, "%u.%u", C(i >> 24) , C(i >> 16));
676 else if ((i & 0xff) == 0)
677 sprintf(line, "%u.%u.%u", C(i >> 24), C(i >> 16), C(i >> 8));
678 else
679 sprintf(line, "%u.%u.%u.%u", C(i >> 24),
680 C(i >> 16), C(i >> 8), C(i));
681 domask(line+strlen(line), i, omask);
608 return (line);
609}
610
611/*
612 * Print routing statistics
613 */
614void
615rt_stats(off)

--- 196 unchanged lines hidden ---
682 return (line);
683}
684
685/*
686 * Print routing statistics
687 */
688void
689rt_stats(off)

--- 196 unchanged lines hidden ---