summaryrefslogtreecommitdiffstats
path: root/sys/net/if.c
diff options
context:
space:
mode:
authorkmacy <kmacy@FreeBSD.org>2008-12-18 04:50:44 +0000
committerkmacy <kmacy@FreeBSD.org>2008-12-18 04:50:44 +0000
commit0e212eb0e18c03ccc92cf87b6fbb4379ff303d32 (patch)
tree8be908be1768b5fcd6dc57f2ce95b9e24bce942a /sys/net/if.c
parentd8f5aa7301a4d36d88c42a46094dc5b6d5c65717 (diff)
downloadFreeBSD-src-0e212eb0e18c03ccc92cf87b6fbb4379ff303d32.zip
FreeBSD-src-0e212eb0e18c03ccc92cf87b6fbb4379ff303d32.tar.gz
add ifnet_byindex_locked to allow for use of IFNET_RLOCK
Diffstat (limited to 'sys/net/if.c')
-rw-r--r--sys/net/if.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/sys/net/if.c b/sys/net/if.c
index 6e71f67..a170d01 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -191,15 +191,24 @@ MALLOC_DEFINE(M_IFNET, "ifnet", "interface internals");
MALLOC_DEFINE(M_IFADDR, "ifaddr", "interface address");
MALLOC_DEFINE(M_IFMADDR, "ether_multi", "link-level multicast address");
-struct ifnet *
-ifnet_byindex(u_short idx)
+static struct ifnet *
+ifnet_byindex_locked(u_short idx)
{
INIT_VNET_NET(curvnet);
struct ifnet *ifp;
- IFNET_WLOCK();
ifp = V_ifindex_table[idx].ife_ifnet;
- IFNET_WUNLOCK();
+ return (ifp);
+}
+
+struct ifnet *
+ifnet_byindex(u_short idx)
+{
+ struct ifnet *ifp;
+
+ IFNET_RLOCK();
+ ifp = ifnet_byindex_locked(idx);
+ IFNET_RUNLOCK();
return (ifp);
}
@@ -218,9 +227,9 @@ ifaddr_byindex(u_short idx)
{
struct ifaddr *ifa;
- IFNET_WLOCK();
- ifa = ifnet_byindex(idx)->if_addr;
- IFNET_WUNLOCK();
+ IFNET_RLOCK();
+ ifa = ifnet_byindex_locked(idx)->if_addr;
+ IFNET_RUNLOCK();
return (ifa);
}
@@ -499,7 +508,7 @@ if_free_type(struct ifnet *ifp, u_char type)
ifnet_setbyindex(ifp->if_index, NULL);
/* XXX: should be locked with if_findindex() */
- while (V_if_index > 0 && ifnet_byindex(V_if_index) == NULL)
+ while (V_if_index > 0 && ifnet_byindex_locked(V_if_index) == NULL)
V_if_index--;
IFNET_WUNLOCK();
OpenPOWER on IntegriCloud