Annotation of 43BSD/etc/XNSrouted/input.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1985 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  *
                      6:  * Includes material written at Cornell University by Bill Nesheim,
                      7:  * by permission of the author.
                      8:  */
                      9: 
                     10: 
                     11: #ifndef lint
                     12: static char sccsid[] = "@(#)input.c    5.6 (Berkeley) 2/14/86";
                     13: #endif not lint
                     14: 
                     15: /*
                     16:  * XNS Routing Table Management Daemon
                     17:  */
                     18: #include "defs.h"
                     19: 
                     20: struct sockaddr *
                     21: xns_nettosa(net)
                     22: union ns_net net;
                     23: {
                     24:        static struct sockaddr_ns sxn;
                     25:        extern char ether_broadcast_addr[6];
                     26:        
                     27:        bzero(&sxn, sizeof (struct sockaddr_ns));
                     28:        sxn.sns_family = AF_NS;
                     29:        sxn.sns_addr.x_net = net;
                     30:        sxn.sns_addr.x_host = *(union ns_host *)ether_broadcast_addr;
                     31:        return( (struct sockaddr *)&sxn);
                     32:        
                     33: }
                     34: 
                     35: /*
                     36:  * Process a newly received packet.
                     37:  */
                     38: rip_input(from, size)
                     39:        struct sockaddr *from;
                     40:        int size;
                     41: {
                     42:        struct rt_entry *rt;
                     43:        struct netinfo *n;
                     44:        struct interface *ifp;
                     45:        int newsize;
                     46:        struct afswitch *afp;
                     47: 
                     48:        
                     49:        ifp = 0;
                     50:        TRACE_INPUT(ifp, from, size);
                     51:        if (from->sa_family >= AF_MAX)
                     52:                return;
                     53:        afp = &afswitch[from->sa_family];
                     54:        
                     55:        size -= sizeof (u_short)        /* command */;
                     56:        n = msg->rip_nets;
                     57: 
                     58:        switch (ntohs(msg->rip_cmd)) {
                     59: 
                     60:        case RIPCMD_REQUEST:
                     61:                newsize = 0;
                     62:                while (size > 0) {
                     63:                        if (size < sizeof (struct netinfo))
                     64:                                break;
                     65:                        size -= sizeof (struct netinfo);
                     66: 
                     67:                        /* 
                     68:                         * A single entry with rip_dst == DSTNETS_ALL and
                     69:                         * metric ``infinity'' means ``all routes''.
                     70:                         */
                     71:                        if (ns_neteqnn(n->rip_dst, ns_anynet) &&
                     72:                            ntohs(n->rip_metric) == HOPCNT_INFINITY &&
                     73:                            size == 0) {
                     74:                                ifp = if_ifwithnet(from);
                     75:                                supply(from, 0, ifp);
                     76:                                return;
                     77:                        }
                     78:                        /*
                     79:                         * request for specific nets
                     80:                         */
                     81:                        rt = rtlookup(xns_nettosa(n->rip_dst));
                     82:                        if (ftrace) {
                     83:                                fprintf(ftrace,
                     84:                                        "specific request for %s",
                     85:                                        xns_nettoa(n->rip_dst));
                     86:                                fprintf(ftrace,
                     87:                                        " yields route %x\n",
                     88:                                        rt);
                     89:                        }
                     90:                        n->rip_metric = htons( rt == 0 ? HOPCNT_INFINITY :
                     91:                                min(rt->rt_metric+1, HOPCNT_INFINITY));
                     92:                        n++;
                     93:                        newsize += sizeof (struct netinfo);
                     94:                }
                     95:                if (newsize > 0) {
                     96:                        msg->rip_cmd = htons(RIPCMD_RESPONSE);
                     97:                        newsize += sizeof (u_short);
                     98:                        /* should check for if with dstaddr(from) first */
                     99:                        (*afp->af_output)(0, from, newsize);
                    100:                        ifp = if_ifwithnet(from);
                    101:                        TRACE_OUTPUT(ifp, from, newsize);
                    102:                        if (ftrace) {
                    103:                                fprintf(ftrace,
                    104:                                        "request arrived on interface %s\n",
                    105:                                        ifp->int_name);
                    106:                        }
                    107:                }
                    108:                return;
                    109: 
                    110:        case RIPCMD_RESPONSE:
                    111:                /* verify message came from a router */
                    112:                if ((*afp->af_portmatch)(from) == 0)
                    113:                        return;
                    114:                (*afp->af_canon)(from);
                    115:                /* are we talking to ourselves? */
                    116:                if (ifp = if_ifwithaddr(from)) {
                    117:                        rt = rtfind(from);
                    118:                        if (rt == 0 || (rt->rt_state & RTS_INTERFACE) == 0)
                    119:                                addrouteforif(ifp);
                    120:                        else
                    121:                                rt->rt_timer = 0;
                    122:                        return;
                    123:                }
                    124:                /* Update timer for interface on which the packet arrived.
                    125:                 * If from other end of a point-to-point link that isn't
                    126:                 * in the routing tables, (re-)add the route.
                    127:                 */
                    128:                if ((rt = rtfind(from)) && (rt->rt_state & RTS_INTERFACE)) {
                    129:                        if(ftrace) fprintf(ftrace, "Got route\n");
                    130:                        rt->rt_timer = 0;
                    131:                } else if (ifp = if_ifwithdstaddr(from)) {
                    132:                        if(ftrace) fprintf(ftrace, "Got partner\n");
                    133:                        addrouteforif(ifp);
                    134:                }
                    135:                for (; size > 0; size -= sizeof (struct netinfo), n++) {
                    136:                        struct sockaddr *sa;
                    137:                        if (size < sizeof (struct netinfo))
                    138:                                break;
                    139:                        if ((unsigned) ntohs(n->rip_metric) >= HOPCNT_INFINITY)
                    140:                                continue;
                    141:                        rt = rtfind(sa = xns_nettosa(n->rip_dst));
                    142:                        if (rt == 0) {
                    143:                                rtadd(sa, from, ntohs(n->rip_metric), 0);
                    144:                                continue;
                    145:                        }
                    146: 
                    147:                        /*
                    148:                         * Update if from gateway and different,
                    149:                         * from anywhere and shorter, or getting stale and equivalent.
                    150:                         */
                    151:                        if ((equal(from, &rt->rt_router) &&
                    152:                            ntohs(n->rip_metric) != rt->rt_metric ) ||
                    153:                            (unsigned) ntohs(n->rip_metric) < rt->rt_metric ||
                    154:                            (rt->rt_timer > (EXPIRE_TIME/2) &&
                    155:                            rt->rt_metric == ntohs(n->rip_metric))) {
                    156:                                rtchange(rt, from, ntohs(n->rip_metric));
                    157:                                rt->rt_timer = 0;
                    158:                        }
                    159:                }
                    160:                return;
                    161:        }
                    162: }

unix.superglobalmegacorp.com

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