Annotation of 43BSDReno/sbin/XNSrouted/input.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1985 The Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * This file includes significant work done at Cornell University by
                      6:  * Bill Nesheim.  That work included by permission.
                      7:  *
                      8:  * Redistribution and use in source and binary forms are permitted
                      9:  * provided that: (1) source distributions retain this entire copyright
                     10:  * notice and comment, and (2) distributions including binaries display
                     11:  * the following acknowledgement:  ``This product includes software
                     12:  * developed by the University of California, Berkeley and its contributors''
                     13:  * in the documentation or other materials provided with the distribution
                     14:  * and in all advertising materials mentioning features or use of this
                     15:  * software. Neither the name of the University nor the names of its
                     16:  * contributors may be used to endorse or promote products derived
                     17:  * from this software without specific prior written permission.
                     18:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                     19:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                     20:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     21:  */
                     22: 
                     23: #ifndef lint
                     24: static char sccsid[] = "@(#)input.c    5.9 (Berkeley) 6/1/90";
                     25: #endif /* not lint */
                     26: 
                     27: /*
                     28:  * XNS Routing Table Management Daemon
                     29:  */
                     30: #include "defs.h"
                     31: 
                     32: struct sockaddr *
                     33: xns_nettosa(net)
                     34: union ns_net net;
                     35: {
                     36:        static struct sockaddr_ns sxn;
                     37:        extern char ether_broadcast_addr[6];
                     38:        
                     39:        bzero(&sxn, sizeof (struct sockaddr_ns));
                     40:        sxn.sns_family = AF_NS;
                     41:        sxn.sns_len = sizeof (sxn);
                     42:        sxn.sns_addr.x_net = net;
                     43:        sxn.sns_addr.x_host = *(union ns_host *)ether_broadcast_addr;
                     44:        return( (struct sockaddr *)&sxn);
                     45:        
                     46: }
                     47: 
                     48: /*
                     49:  * Process a newly received packet.
                     50:  */
                     51: rip_input(from, size)
                     52:        struct sockaddr *from;
                     53:        int size;
                     54: {
                     55:        struct rt_entry *rt;
                     56:        struct netinfo *n;
                     57:        struct interface *ifp;
                     58:        int newsize;
                     59:        struct afswitch *afp;
                     60: 
                     61:        
                     62:        ifp = 0;
                     63:        TRACE_INPUT(ifp, from, size);
                     64:        if (from->sa_family >= AF_MAX)
                     65:                return;
                     66:        afp = &afswitch[from->sa_family];
                     67:        
                     68:        size -= sizeof (u_short)        /* command */;
                     69:        n = msg->rip_nets;
                     70: 
                     71:        switch (ntohs(msg->rip_cmd)) {
                     72: 
                     73:        case RIPCMD_REQUEST:
                     74:                newsize = 0;
                     75:                while (size > 0) {
                     76:                        if (size < sizeof (struct netinfo))
                     77:                                break;
                     78:                        size -= sizeof (struct netinfo);
                     79: 
                     80:                        /* 
                     81:                         * A single entry with rip_dst == DSTNETS_ALL and
                     82:                         * metric ``infinity'' means ``all routes''.
                     83:                         */
                     84:                        if (ns_neteqnn(n->rip_dst, ns_anynet) &&
                     85:                            ntohs(n->rip_metric) == HOPCNT_INFINITY &&
                     86:                            size == 0) {
                     87:                                ifp = if_ifwithnet(from);
                     88:                                supply(from, 0, ifp);
                     89:                                return;
                     90:                        }
                     91:                        /*
                     92:                         * request for specific nets
                     93:                         */
                     94:                        rt = rtlookup(xns_nettosa(n->rip_dst));
                     95:                        if (ftrace) {
                     96:                                fprintf(ftrace,
                     97:                                        "specific request for %s",
                     98:                                        xns_nettoa(n->rip_dst));
                     99:                                fprintf(ftrace,
                    100:                                        " yields route %x\n",
                    101:                                        rt);
                    102:                        }
                    103:                        n->rip_metric = htons( rt == 0 ? HOPCNT_INFINITY :
                    104:                                min(rt->rt_metric+1, HOPCNT_INFINITY));
                    105:                        n++;
                    106:                        newsize += sizeof (struct netinfo);
                    107:                }
                    108:                if (newsize > 0) {
                    109:                        msg->rip_cmd = htons(RIPCMD_RESPONSE);
                    110:                        newsize += sizeof (u_short);
                    111:                        /* should check for if with dstaddr(from) first */
                    112:                        (*afp->af_output)(0, from, newsize);
                    113:                        ifp = if_ifwithnet(from);
                    114:                        TRACE_OUTPUT(ifp, from, newsize);
                    115:                        if (ftrace) {
                    116:                                fprintf(ftrace,
                    117:                                        "request arrived on interface %s\n",
                    118:                                        ifp->int_name);
                    119:                        }
                    120:                }
                    121:                return;
                    122: 
                    123:        case RIPCMD_RESPONSE:
                    124:                /* verify message came from a router */
                    125:                if ((*afp->af_portmatch)(from) == 0)
                    126:                        return;
                    127:                (*afp->af_canon)(from);
                    128:                /* are we talking to ourselves? */
                    129:                if (ifp = if_ifwithaddr(from)) {
                    130:                        rt = rtfind(from);
                    131:                        if (rt == 0 || (rt->rt_state & RTS_INTERFACE) == 0)
                    132:                                addrouteforif(ifp);
                    133:                        else
                    134:                                rt->rt_timer = 0;
                    135:                        return;
                    136:                }
                    137:                /* Update timer for interface on which the packet arrived.
                    138:                 * If from other end of a point-to-point link that isn't
                    139:                 * in the routing tables, (re-)add the route.
                    140:                 */
                    141:                if ((rt = rtfind(from)) && (rt->rt_state & RTS_INTERFACE)) {
                    142:                        if(ftrace) fprintf(ftrace, "Got route\n");
                    143:                        rt->rt_timer = 0;
                    144:                } else if (ifp = if_ifwithdstaddr(from)) {
                    145:                        if(ftrace) fprintf(ftrace, "Got partner\n");
                    146:                        addrouteforif(ifp);
                    147:                }
                    148:                for (; size > 0; size -= sizeof (struct netinfo), n++) {
                    149:                        struct sockaddr *sa;
                    150:                        if (size < sizeof (struct netinfo))
                    151:                                break;
                    152:                        if ((unsigned) ntohs(n->rip_metric) >= HOPCNT_INFINITY)
                    153:                                continue;
                    154:                        rt = rtfind(sa = xns_nettosa(n->rip_dst));
                    155:                        if (rt == 0) {
                    156:                                rtadd(sa, from, ntohs(n->rip_metric), 0);
                    157:                                continue;
                    158:                        }
                    159: 
                    160:                        /*
                    161:                         * Update if from gateway and different,
                    162:                         * from anywhere and shorter, or getting stale and equivalent.
                    163:                         */
                    164:                        if ((equal(from, &rt->rt_router) &&
                    165:                            ntohs(n->rip_metric) != rt->rt_metric ) ||
                    166:                            (unsigned) ntohs(n->rip_metric) < rt->rt_metric ||
                    167:                            (rt->rt_timer > (EXPIRE_TIME/2) &&
                    168:                            rt->rt_metric == ntohs(n->rip_metric))) {
                    169:                                rtchange(rt, from, ntohs(n->rip_metric));
                    170:                                rt->rt_timer = 0;
                    171:                        }
                    172:                }
                    173:                return;
                    174:        }
                    175: }

unix.superglobalmegacorp.com

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