=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/netstat/route.c,v retrieving revision 1.8 retrieving revision 1.9 diff -c -r1.8 -r1.9 *** src/usr.bin/netstat/route.c 1997/01/25 23:26:42 1.8 --- src/usr.bin/netstat/route.c 1997/06/18 01:52:27 1.9 *************** *** 1,4 **** ! /* $OpenBSD: route.c,v 1.8 1997/01/25 23:26:42 tholo Exp $ */ /* $NetBSD: route.c,v 1.15 1996/05/07 02:55:06 thorpej Exp $ */ /* --- 1,4 ---- ! /* $OpenBSD: route.c,v 1.9 1997/06/18 01:52:27 angelos Exp $ */ /* $NetBSD: route.c,v 1.15 1996/05/07 02:55:06 thorpej Exp $ */ /* *************** *** 38,44 **** #if 0 static char sccsid[] = "from: @(#)route.c 8.3 (Berkeley) 3/9/94"; #else ! static char *rcsid = "$OpenBSD: route.c,v 1.8 1997/01/25 23:26:42 tholo Exp $"; #endif #endif /* not lint */ --- 38,44 ---- #if 0 static char sccsid[] = "from: @(#)route.c 8.3 (Berkeley) 3/9/94"; #else ! static char *rcsid = "$OpenBSD: route.c,v 1.9 1997/06/18 01:52:27 angelos Exp $"; #endif #endif /* not lint */ *************** *** 66,71 **** --- 66,77 ---- #include #include #include + + #ifndef INET + #define INET + #endif + + #include #include "netstat.h" #define kget(p, d) (kread((u_long)(p), (char *)&(d), sizeof (d))) *************** *** 114,119 **** --- 120,126 ---- static void p_sockaddr __P((struct sockaddr *, int, int)); static void p_flags __P((int, char *)); static void p_rtentry __P((struct rtentry *)); + static void encap_print __P((struct rtentry *)); /* * Print routing tables. *************** *** 148,154 **** } else if (af == AF_UNSPEC || af == i) { pr_family(i); do_rtent = 1; ! pr_rthdr(); p_tree(head.rnh_treetop); } } --- 155,164 ---- } else if (af == AF_UNSPEC || af == i) { pr_family(i); do_rtent = 1; ! if (i != AF_ENCAP) ! pr_rthdr(); ! else ! pr_encaphdr(); p_tree(head.rnh_treetop); } } *************** *** 180,185 **** --- 190,198 ---- case AF_CCITT: afname = "X.25"; break; + case AF_ENCAP: + afname = "Encap"; + break; default: afname = NULL; break; *************** *** 209,214 **** --- 222,241 ---- "Flags", "Refs", "Use", "Mtu", "Interface"); } + /* + * Print header for AF_ENCAP entries. + */ + void + pr_encaphdr() + { + if (Aflag) + printf("%-8s ", "Address"); + printf("%-15s %-15s %-5s %-15s %-15s %-5s %-5s %-15s %-15s %-8s %-9s %s\n", + "Source address", "Source mask", "Port", "Dest. address", + "Dest. mask", "Port", "Proto", "Tunnel entry", "Tunnel exit", + "SPI", "Interface", "Use"); + } + static struct sockaddr * kgetsa(dst) register struct sockaddr *dst; *************** *** 347,355 **** if (rtm->rtm_addrs == RTA_DST) p_sockaddr(sa, 0, 36); else { ! p_sockaddr(sa, rtm->rtm_flags, 16); if (sa->sa_len == 0) ! sa->sa_len = sizeof(long); sa = (struct sockaddr *)(sa->sa_len + (char *)sa); p_sockaddr(sa, 0, 18); } --- 374,382 ---- if (rtm->rtm_addrs == RTA_DST) p_sockaddr(sa, 0, 36); else { ! p_sockaddr(sa, rtm->rtm_flags, 16); if (sa->sa_len == 0) ! sa->sa_len = sizeof(long); sa = (struct sockaddr *)(sa->sa_len + (char *)sa); p_sockaddr(sa, 0, 18); } *************** *** 384,390 **** case AF_IPX: cp = ipx_print(sa); break; ! case AF_LINK: { register struct sockaddr_dl *sdl = (struct sockaddr_dl *)sa; --- 411,417 ---- case AF_IPX: cp = ipx_print(sa); break; ! case AF_LINK: { register struct sockaddr_dl *sdl = (struct sockaddr_dl *)sa; *************** *** 464,471 **** register struct rtentry *rt; { static struct ifnet ifnet, *lastif; ! ! p_sockaddr(kgetsa(rt_key(rt)), rt->rt_flags, WID_DST); p_sockaddr(kgetsa(rt->rt_gateway), RTF_HOST, WID_GW); p_flags(rt->rt_flags, "%-6.6s "); printf("%6d %8d ", rt->rt_refcnt, rt->rt_use); --- 491,507 ---- register struct rtentry *rt; { static struct ifnet ifnet, *lastif; ! struct sockaddr *sa; ! ! sa = kgetsa(rt_key(rt)); ! ! if (sa->sa_family == AF_ENCAP) ! { ! encap_print(rt); ! return; ! } ! ! p_sockaddr(sa, rt->rt_flags, WID_DST); p_sockaddr(kgetsa(rt->rt_gateway), RTF_HOST, WID_GW); p_flags(rt->rt_flags, "%-6.6s "); printf("%6d %8d ", rt->rt_refcnt, rt->rt_use); *************** *** 744,749 **** --- 780,805 ---- p = ipx_print((struct sockaddr *)&work); if (strncmp("0H.", p, 3) == 0) p += 3; return(p); + } + + static void + encap_print(rt) + register struct rtentry *rt; + { + struct sockaddr_encap sen1, sen2, sen3; + + bcopy(kgetsa(rt_key(rt)), &sen1, sizeof(sen1)); + bcopy(kgetsa(rt_mask(rt)), &sen2, sizeof(sen2)); + bcopy(kgetsa(rt->rt_gateway), &sen3, sizeof(sen3)); + + printf("%-15s ", inet_ntoa(sen1.sen_ip_src)); + printf("%-15s %-5u ", inet_ntoa(sen2.sen_ip_src), sen1.sen_sport); + printf("%-15s ", inet_ntoa(sen1.sen_ip_dst)); + printf("%-15s %-5u %-5u ", inet_ntoa(sen2.sen_ip_dst), + sen1.sen_dport, sen1.sen_proto); + printf("%-15s ", inet_ntoa(sen3.sen_ipsp_src)); + printf("%-15s %08x enc%-6u %-u\n", inet_ntoa(sen3.sen_ipsp_dst), + ntohl(sen3.sen_ipsp_spi), sen3.sen_ipsp_ifn, rt->rt_use); } void