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

1.1       root        1: /*
                      2:  * Copyright (c) 1983 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: 
                      7: #ifndef lint
                      8: static char sccsid[] = "@(#)if.c       5.3 (Berkeley) 4/20/86";
                      9: #endif not lint
                     10: 
                     11: /*
                     12:  * Routing Table Management Daemon
                     13:  */
                     14: #include "defs.h"
                     15: 
                     16: extern struct interface *ifnet;
                     17: 
                     18: /*
                     19:  * Find the interface with address addr.
                     20:  */
                     21: struct interface *
                     22: if_ifwithaddr(addr)
                     23:        struct sockaddr *addr;
                     24: {
                     25:        register struct interface *ifp;
                     26: 
                     27: #define        same(a1, a2) \
                     28:        (bcmp((caddr_t)((a1)->sa_data), (caddr_t)((a2)->sa_data), 14) == 0)
                     29:        for (ifp = ifnet; ifp; ifp = ifp->int_next) {
                     30:                if (ifp->int_flags & IFF_REMOTE)
                     31:                        continue;
                     32:                if (ifp->int_addr.sa_family != addr->sa_family)
                     33:                        continue;
                     34:                if (same(&ifp->int_addr, addr))
                     35:                        break;
                     36:                if ((ifp->int_flags & IFF_BROADCAST) &&
                     37:                    same(&ifp->int_broadaddr, addr))
                     38:                        break;
                     39:        }
                     40:        return (ifp);
                     41: }
                     42: 
                     43: /*
                     44:  * Find the point-to-point interface with destination address addr.
                     45:  */
                     46: struct interface *
                     47: if_ifwithdstaddr(addr)
                     48:        struct sockaddr *addr;
                     49: {
                     50:        register struct interface *ifp;
                     51: 
                     52:        for (ifp = ifnet; ifp; ifp = ifp->int_next) {
                     53:                if ((ifp->int_flags & IFF_POINTOPOINT) == 0)
                     54:                        continue;
                     55:                if (same(&ifp->int_dstaddr, addr))
                     56:                        break;
                     57:        }
                     58:        return (ifp);
                     59: }
                     60: 
                     61: /*
                     62:  * Find the interface on the network 
                     63:  * of the specified address.
                     64:  */
                     65: struct interface *
                     66: if_ifwithnet(addr)
                     67:        register struct sockaddr *addr;
                     68: {
                     69:        register struct interface *ifp;
                     70:        register int af = addr->sa_family;
                     71:        register int (*netmatch)();
                     72: 
                     73:        if (af >= af_max)
                     74:                return (0);
                     75:        netmatch = afswitch[af].af_netmatch;
                     76:        for (ifp = ifnet; ifp; ifp = ifp->int_next) {
                     77:                if (ifp->int_flags & IFF_REMOTE)
                     78:                        continue;
                     79:                if (af != ifp->int_addr.sa_family)
                     80:                        continue;
                     81:                if ((*netmatch)(addr, &ifp->int_addr))
                     82:                        break;
                     83:        }
                     84:        return (ifp);
                     85: }
                     86: 
                     87: /*
                     88:  * Find an interface from which the specified address
                     89:  * should have come from.  Used for figuring out which
                     90:  * interface a packet came in on -- for tracing.
                     91:  */
                     92: struct interface *
                     93: if_iflookup(addr)
                     94:        struct sockaddr *addr;
                     95: {
                     96:        register struct interface *ifp, *maybe;
                     97:        register int af = addr->sa_family;
                     98:        register int (*netmatch)();
                     99: 
                    100:        if (af >= af_max)
                    101:                return (0);
                    102:        maybe = 0;
                    103:        netmatch = afswitch[af].af_netmatch;
                    104:        for (ifp = ifnet; ifp; ifp = ifp->int_next) {
                    105:                if (ifp->int_addr.sa_family != af)
                    106:                        continue;
                    107:                if (same(&ifp->int_addr, addr))
                    108:                        break;
                    109:                if ((ifp->int_flags & IFF_BROADCAST) &&
                    110:                    same(&ifp->int_broadaddr, addr))
                    111:                        break;
                    112:                if ((ifp->int_flags & IFF_POINTOPOINT) &&
                    113:                    same(&ifp->int_dstaddr, addr))
                    114:                        break;
                    115:                if (maybe == 0 && (*netmatch)(addr, &ifp->int_addr))
                    116:                        maybe = ifp;
                    117:        }
                    118:        if (ifp == 0)
                    119:                ifp = maybe;
                    120:        return (ifp);
                    121: }

unix.superglobalmegacorp.com

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