|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.