Annotation of 42BSD/etc/routed/if.c, revision 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.