diff options
author | kmacy <kmacy@FreeBSD.org> | 2008-12-18 04:50:44 +0000 |
---|---|---|
committer | kmacy <kmacy@FreeBSD.org> | 2008-12-18 04:50:44 +0000 |
commit | 0e212eb0e18c03ccc92cf87b6fbb4379ff303d32 (patch) | |
tree | 8be908be1768b5fcd6dc57f2ce95b9e24bce942a /sys/net/if.c | |
parent | d8f5aa7301a4d36d88c42a46094dc5b6d5c65717 (diff) | |
download | FreeBSD-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.c | 25 |
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(); |