Annotation of 42BSD/etc/routed/if.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)if.c       4.3 (Berkeley) 5/25/83";
                      3: #endif
                      4: 
                      5: /*
                      6:  * Routing Table Management Daemon
                      7:  */
                      8: #include "defs.h"
                      9: 
                     10: extern struct interface *ifnet;
                     11: 
                     12: /*
                     13:  * Find the interface with address add.
                     14:  */
                     15: struct interface *
                     16: if_ifwithaddr(addr)
                     17:        struct sockaddr *addr;
                     18: {
                     19:        register struct interface *ifp;
                     20: 
                     21: #define        same(a1, a2) \
                     22:        (bcmp((caddr_t)((a1)->sa_data), (caddr_t)((a2)->sa_data), 14) == 0)
                     23:        for (ifp = ifnet; ifp; ifp = ifp->int_next) {
                     24:                if (ifp->int_flags & IFF_REMOTE)
                     25:                        continue;
                     26:                if (ifp->int_addr.sa_family != addr->sa_family)
                     27:                        continue;
                     28:                if (same(&ifp->int_addr, addr))
                     29:                        break;
                     30:                if ((ifp->int_flags & IFF_BROADCAST) &&
                     31:                    same(&ifp->int_broadaddr, addr))
                     32:                        break;
                     33:        }
                     34:        return (ifp);
                     35: }
                     36: 
                     37: /*
                     38:  * Find the interface on the network 
                     39:  * of the specified address.
                     40:  */
                     41: struct interface *
                     42: if_ifwithnet(addr)
                     43:        register struct sockaddr *addr;
                     44: {
                     45:        register struct interface *ifp;
                     46:        register int af = addr->sa_family;
                     47:        register int (*netmatch)();
                     48: 
                     49:        if (af >= AF_MAX)
                     50:                return (0);
                     51:        netmatch = afswitch[af].af_netmatch;
                     52:        for (ifp = ifnet; ifp; ifp = ifp->int_next) {
                     53:                if (ifp->int_flags & IFF_REMOTE)
                     54:                        continue;
                     55:                if (af != ifp->int_addr.sa_family)
                     56:                        continue;
                     57:                if ((*netmatch)(addr, &ifp->int_addr))
                     58:                        break;
                     59:        }
                     60:        return (ifp);
                     61: }
                     62: 
                     63: /*
                     64:  * Find an interface from which the specified address
                     65:  * should have come from.  Used for figuring out which
                     66:  * interface a packet came in on -- for tracing.
                     67:  */
                     68: struct interface *
                     69: if_iflookup(addr)
                     70:        struct sockaddr *addr;
                     71: {
                     72:        register struct interface *ifp, *maybe;
                     73:        register int af = addr->sa_family;
                     74:        register int (*netmatch)();
                     75: 
                     76:        if (af >= AF_MAX)
                     77:                return (0);
                     78:        maybe = 0;
                     79:        netmatch = afswitch[af].af_netmatch;
                     80:        for (ifp = ifnet; ifp; ifp = ifp->int_next) {
                     81:                if (ifp->int_addr.sa_family != af)
                     82:                        continue;
                     83:                if (same(&ifp->int_addr, addr))
                     84:                        break;
                     85:                if ((ifp->int_flags & IFF_BROADCAST) &&
                     86:                    same(&ifp->int_broadaddr, addr))
                     87:                        break;
                     88:                if (maybe == 0 && (*netmatch)(addr, &ifp->int_addr))
                     89:                        maybe = ifp;
                     90:        }
                     91:        if (ifp == 0)
                     92:                ifp = maybe;
                     93:        return (ifp);
                     94: }

unix.superglobalmegacorp.com

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