|
|
1.1 root 1: /*
2: * Copyright (c) 1983 The Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that: (1) source distributions retain this entire copyright
7: * notice and comment, and (2) distributions including binaries display
8: * the following acknowledgement: ``This product includes software
9: * developed by the University of California, Berkeley and its contributors''
10: * in the documentation or other materials provided with the distribution
11: * and in all advertising materials mentioning features or use of this
12: * software. Neither the name of the University nor the names of its
13: * contributors may be used to endorse or promote products derived
14: * from this software without specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: *
19: * static char sccsid[] = "@(#)if.c 5.1 (Berkeley) 6/4/85"; (routed/if.c)
20: */
21:
22: #ifndef lint
23: static char sccsid[] = "@(#)if.c 5.2 (Berkeley) 6/1/90";
24: #endif /* not lint */
25:
26: /*
27: * Routing Table Management Daemon
28: */
29: #include "defs.h"
30:
31: extern struct interface *ifnet;
32:
33: /*
34: * Find the interface with address addr.
35: */
36: struct interface *
37: if_ifwithaddr(addr)
38: struct sockaddr *addr;
39: {
40: register struct interface *ifp;
41:
42: #define same(a1, a2) \
43: (bcmp((caddr_t)((a1)->sa_data), (caddr_t)((a2)->sa_data), 14) == 0)
44: for (ifp = ifnet; ifp; ifp = ifp->int_next) {
45: if (ifp->int_flags & IFF_REMOTE)
46: continue;
47: if (ifp->int_addr.sa_family != addr->sa_family)
48: continue;
49: if (same(&ifp->int_addr, addr))
50: break;
51: if ((ifp->int_flags & IFF_BROADCAST) &&
52: same(&ifp->int_broadaddr, addr))
53: break;
54: }
55: return (ifp);
56: }
57:
58: /*
59: * Find the point-to-point interface with destination address addr.
60: */
61: struct interface *
62: if_ifwithdstaddr(addr)
63: struct sockaddr *addr;
64: {
65: register struct interface *ifp;
66:
67: for (ifp = ifnet; ifp; ifp = ifp->int_next) {
68: if ((ifp->int_flags & IFF_POINTOPOINT) == 0)
69: continue;
70: if (same(&ifp->int_dstaddr, addr))
71: break;
72: }
73: return (ifp);
74: }
75:
76: /*
77: * Find the interface on the network
78: * of the specified address.
79: */
80: struct interface *
81: if_ifwithnet(addr)
82: register struct sockaddr *addr;
83: {
84: register struct interface *ifp;
85: register int af = addr->sa_family;
86: register int (*netmatch)();
87:
88: if (af >= AF_MAX)
89: return (0);
90: netmatch = afswitch[af].af_netmatch;
91: for (ifp = ifnet; ifp; ifp = ifp->int_next) {
92: if (ifp->int_flags & IFF_REMOTE)
93: continue;
94: if (af != ifp->int_addr.sa_family)
95: continue;
96: if ((*netmatch)(addr, &ifp->int_addr))
97: break;
98: }
99: return (ifp);
100: }
101:
102: /*
103: * Find an interface from which the specified address
104: * should have come from. Used for figuring out which
105: * interface a packet came in on -- for tracing.
106: */
107: struct interface *
108: if_iflookup(addr)
109: struct sockaddr *addr;
110: {
111: register struct interface *ifp, *maybe;
112: register int af = addr->sa_family;
113: register int (*netmatch)();
114:
115: if (af >= AF_MAX)
116: return (0);
117: maybe = 0;
118: netmatch = afswitch[af].af_netmatch;
119: for (ifp = ifnet; ifp; ifp = ifp->int_next) {
120: if (ifp->int_addr.sa_family != af)
121: continue;
122: if (same(&ifp->int_addr, addr))
123: break;
124: if ((ifp->int_flags & IFF_BROADCAST) &&
125: same(&ifp->int_broadaddr, addr))
126: break;
127: if (maybe == 0 && (*netmatch)(addr, &ifp->int_addr))
128: maybe = ifp;
129: }
130: if (ifp == 0)
131: ifp = maybe;
132: return (ifp);
133: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.