Annotation of cci/usr/src/etc/nstat/route.c, revision 1.1.1.1

1.1       root        1: 
                      2: #include <stdio.h>
                      3: #include <sys/types.h>
                      4: #include <sys/socket.h>
                      5: #include <sys/mbuf.h>
                      6: 
                      7: #include <net/if.h>
                      8: #define        KERNEL          /* to get routehash and RTHASHSIZ */
                      9: #include <net/route.h>
                     10: #include <netinet/in.h>
                     11: #include <netdb.h>
                     12: #include <nlist.h>
                     13: #include "nstat.h"
                     14: 
                     15: 
                     16: struct nlist   routenl[] = {
                     17: #                      define  N_RTHOST        0
                     18:        { "_rthost" },
                     19: #                      define  N_RTNET         1
                     20:        { "_rtnet" },
                     21: #                      define  N_RTSTAT        2
                     22:        { "_rtstat" },
                     23:        { "" },
                     24: };
                     25: static int     getvm = 0;
                     26: extern long    flaggiven;
                     27: extern int     kmem;           /* file descriptor of kmem file */
                     28: extern char    *routename();
                     29: extern char    *system;
                     30: 
                     31: /*
                     32:  * Definitions for showing gateway flags.
                     33:  */
                     34: struct bits {
                     35:        short   b_mask;
                     36:        char    b_val;
                     37: } bits[] = {
                     38:        { RTF_UP,       'U' },
                     39:        { RTF_GATEWAY,  'G' },
                     40:        { RTF_HOST,     'H' },
                     41:        { 0 }
                     42: };
                     43: 
                     44: /*
                     45:  * Print routing tables.
                     46:  */
                     47: routepr()
                     48: {
                     49:        off_t hostaddr, netaddr;
                     50:        struct mbuf mb;
                     51:        register struct rtentry *rt;
                     52:        register struct mbuf *m;
                     53:        register struct bits *p;
                     54:        struct netent *np;
                     55:        struct hostent *hp;
                     56:        char name[16], *flags;
                     57:        struct mbuf *routehash[RTHASHSIZ];
                     58:        struct ifnet ifnet;
                     59:        int first = 1, i, doinghost = 1;
                     60: 
                     61: 
                     62:        if (!getvm) {
                     63:                nlist(system, routenl);
                     64:                ++getvm;
                     65:        }
                     66:        hostaddr = routenl[N_RTHOST].n_value;
                     67:        netaddr = routenl[N_RTNET].n_value;
                     68:        if (hostaddr == 0) {
                     69:                printf("rthost: symbol not in namelist\n");
                     70:                return;
                     71:        }
                     72:        if (netaddr == 0) {
                     73:                printf("rtnet: symbol not in namelist\n");
                     74:                return;
                     75:        }
                     76:        klseek(kmem, hostaddr, 0);
                     77:        read(kmem, routehash, sizeof (routehash));
                     78:        printf("Routing Tables\n");
                     79:        printf("%-15.15s %-15.15s %-8.8s %-6.6s %-10.10s %s\n",
                     80:                "Destination", "Gateway",
                     81:                "Flags", "Refcnt", "Use", "Interface");
                     82: again:
                     83:        for (i = 0; i < RTHASHSIZ; i++) {
                     84:                if (routehash[i] == 0)
                     85:                        continue;
                     86:                m = routehash[i];
                     87:                while (m) {
                     88:                        struct sockaddr_in *sin;
                     89: 
                     90:                        klseek(kmem, m, 0);
                     91:                        read(kmem, &mb, sizeof (mb));
                     92:                        rt = mtod(&mb, struct rtentry *);
                     93:                        sin = (struct sockaddr_in *)&rt->rt_dst;
                     94:                        printf("%-15.15s ",
                     95:                            sin->sin_addr.s_addr ?
                     96:                                routename(sin->sin_addr) : "default");
                     97:                        sin = (struct sockaddr_in *)&rt->rt_gateway;
                     98:                        printf("%-15.15s ", routename(sin->sin_addr));
                     99:                        for (flags = name, p = bits; p->b_mask; p++)
                    100:                                if (p->b_mask & rt->rt_flags)
                    101:                                        *flags++ = p->b_val;
                    102:                        *flags = '\0';
                    103:                        printf("%-8.8s %-6d %-10d ", name,
                    104:                                rt->rt_refcnt, rt->rt_use);
                    105:                        if (rt->rt_ifp == 0) {
                    106:                                putchar('\n');
                    107:                                m = mb.m_next;
                    108:                                continue;
                    109:                        }
                    110:                        klseek(kmem, rt->rt_ifp, 0);
                    111:                        read(kmem, &ifnet, sizeof (ifnet));
                    112:                        klseek(kmem, (int)ifnet.if_name, 0);
                    113:                        read(kmem, name, 16);
                    114:                        printf("%s%d\n", name, ifnet.if_unit);
                    115:                        m = mb.m_next;
                    116:                }
                    117:        }
                    118:        if (doinghost) {
                    119:                klseek(kmem, netaddr, 0);
                    120:                read(kmem, routehash, sizeof (routehash));
                    121:                doinghost = 0;
                    122:                goto again;
                    123:        }
                    124: }
                    125: 
                    126: char *
                    127: routename(in)
                    128:        struct in_addr in;
                    129: {
                    130:        char *cp = 0;
                    131:        static char line[50];
                    132:        int lna, net;
                    133: 
                    134:        net = inet_netof(in);
                    135:        lna = inet_lnaof(in);
                    136:        if (!nflag) {
                    137:                if (lna == INADDR_ANY) {
                    138:                        struct netent *np = getnetbyaddr(net, AF_INET);
                    139: 
                    140:                        if (np)
                    141:                                cp = np->n_name;
                    142:                } else {
                    143:                        struct hostent *hp;
                    144: 
                    145:                        hp = gethostbyaddr(&in, sizeof (struct in_addr),
                    146:                                AF_INET);
                    147:                        if (hp)
                    148:                                cp = hp->h_name;
                    149:                }
                    150:        }
                    151:        if (cp)
                    152:                strcpy(line, cp);
                    153:        else {
                    154:                u_char *ucp = (u_char *)&in;
                    155:                if (lna == INADDR_ANY)
                    156:                        sprintf(line, "%u.%u.%u", ucp[0], ucp[1], ucp[2]);
                    157:                else
                    158:                        sprintf(line, "%u.%u.%u.%u", ucp[0], ucp[1],
                    159:                                ucp[2], ucp[3]);
                    160:        }
                    161:        return (line);
                    162: }
                    163: 
                    164: /*
                    165:  * Print routing statistics
                    166:  */
                    167: rt_stats()
                    168: {
                    169:        off_t off;
                    170:        struct rtstat rtstat;
                    171: 
                    172:        if (!getvm) {
                    173:                nlist(system, routenl);
                    174:                ++getvm;
                    175:        }
                    176:        off = routenl[N_RTSTAT].n_value;
                    177:        if (off == 0) {
                    178:                printf("rtstat: symbol not in namelist\n");
                    179:                return;
                    180:        }
                    181:        klseek(kmem, off, 0);
                    182:        read(kmem, (char *)&rtstat, sizeof (rtstat));
                    183:        printf("routing:\n");
                    184:        printf("\t%d bad routing redirect%s\n",
                    185:                rtstat.rts_badredirect, plural(rtstat.rts_badredirect));
                    186:        printf("\t%d dynamically created route%s\n",
                    187:                rtstat.rts_dynamic, plural(rtstat.rts_dynamic));
                    188:        printf("\t%d new gateway%s due to redirects\n",
                    189:                rtstat.rts_newgateway, plural(rtstat.rts_newgateway));
                    190:        printf("\t%d destination%s found unreachable\n",
                    191:                rtstat.rts_unreach, plural(rtstat.rts_unreach));
                    192:        printf("\t%d use%s of a wildcard route\n",
                    193:                rtstat.rts_wildcard, plural(rtstat.rts_wildcard));
                    194: }
                    195: /*
                    196:  * 
                    197:  */
                    198: printrt(rt)
                    199: register struct rtentry *rt;
                    200: {
                    201:        struct mbuf mb;
                    202:        register struct bits *p;
                    203:        struct rtentry routentry;
                    204:        struct netent *np;
                    205:        struct hostent *hp;
                    206:        char name[16], *flags;
                    207:        struct mbuf *routehash[RTHASHSIZ];
                    208:        struct ifnet ifnet;
                    209:        struct sockaddr_in *sin;
                    210:        int first = 1, i, doinghost = 1;
                    211: 
                    212:        printf("---Ro_rt:");fflush(stdout);
                    213: 
                    214:        klseek(kmem, rt, 0);
                    215:        read(kmem, &routentry, sizeof (routentry));
                    216:        rt = &routentry;
                    217:        sin = (struct sockaddr_in *)&rt->rt_dst;
                    218:        printf("Dest:%s; ",
                    219:            sin->sin_addr.s_addr ?
                    220:                routename(sin->sin_addr) : "default");
                    221:        sin = (struct sockaddr_in *)&rt->rt_gateway;
                    222:        printf("\n\tGate:%s; ", routename(sin->sin_addr));
                    223:        for (flags = name, p = bits; p->b_mask; p++)
                    224:                if (p->b_mask & rt->rt_flags)
                    225:                        *flags++ = p->b_val;
                    226:        *flags = '\0';
                    227:        printf("flag:%s; refc:%d; use:%d ", name,
                    228:                rt->rt_refcnt, rt->rt_use);
                    229:        if (rt->rt_ifp == 0) {
                    230:                return;
                    231:        }
                    232:        klseek(kmem, rt->rt_ifp, 0);
                    233:        read(kmem, &ifnet, sizeof (ifnet));
                    234:        klseek(kmem, (int)ifnet.if_name, 0);
                    235:        read(kmem, name, 16);
                    236:        printf("interf:%s, unit:%d", name, ifnet.if_unit);
                    237: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.