umount -> unmount
[unix-history] / usr / src / sbin / routed / if.c
CommitLineData
7ab5124a
SL
1#ifndef lint
2static char sccsid[] = "@(#)if.c 4.1 %G%";
3#endif
4
5/*
6 * Routing Table Management Daemon
7 */
8#include "router.h"
9
10extern struct interface *ifnet;
11
12/*
13 * Find the interface with address add.
14 */
15struct interface *
16if_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 */
41struct interface *
42if_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 */
68struct interface *
69if_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}