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