aboutsummaryrefslogtreecommitdiff
path: root/sys/netinet/in.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/netinet/in.c')
-rw-r--r--sys/netinet/in.c46
1 files changed, 20 insertions, 26 deletions
diff --git a/sys/netinet/in.c b/sys/netinet/in.c
index aa87546be2d4..8eb20f0f2d27 100644
--- a/sys/netinet/in.c
+++ b/sys/netinet/in.c
@@ -46,7 +46,6 @@ __FBSDID("$FreeBSD$");
#include <sys/kernel.h>
#include <sys/lock.h>
#include <sys/proc.h>
-#include <sys/rmlock.h>
#include <sys/sysctl.h>
#include <sys/syslog.h>
#include <sys/sx.h>
@@ -124,21 +123,18 @@ in_localaddr(struct in_addr in)
* Return 1 if an internet address is for the local host and configured
* on one of its interfaces.
*/
-int
+bool
in_localip(struct in_addr in)
{
- struct rm_priotracker in_ifa_tracker;
struct in_ifaddr *ia;
- IN_IFADDR_RLOCK(&in_ifa_tracker);
- LIST_FOREACH(ia, INADDR_HASH(in.s_addr), ia_hash) {
- if (IA_SIN(ia)->sin_addr.s_addr == in.s_addr) {
- IN_IFADDR_RUNLOCK(&in_ifa_tracker);
- return (1);
- }
- }
- IN_IFADDR_RUNLOCK(&in_ifa_tracker);
- return (0);
+ NET_EPOCH_ASSERT();
+
+ CK_LIST_FOREACH(ia, INADDR_HASH(in.s_addr), ia_hash)
+ if (IA_SIN(ia)->sin_addr.s_addr == in.s_addr)
+ return (true);
+
+ return (false);
}
/*
@@ -170,24 +166,24 @@ in_ifhasaddr(struct ifnet *ifp, struct in_addr in)
static struct in_ifaddr *
in_localip_more(struct in_ifaddr *original_ia)
{
- struct rm_priotracker in_ifa_tracker;
+ struct epoch_tracker et;
in_addr_t original_addr = IA_SIN(original_ia)->sin_addr.s_addr;
uint32_t original_fib = original_ia->ia_ifa.ifa_ifp->if_fib;
struct in_ifaddr *ia;
- IN_IFADDR_RLOCK(&in_ifa_tracker);
- LIST_FOREACH(ia, INADDR_HASH(original_addr), ia_hash) {
+ NET_EPOCH_ENTER(et);
+ CK_LIST_FOREACH(ia, INADDR_HASH(original_addr), ia_hash) {
in_addr_t addr = IA_SIN(ia)->sin_addr.s_addr;
uint32_t fib = ia->ia_ifa.ifa_ifp->if_fib;
if (!V_rt_add_addr_allfibs && (original_fib != fib))
continue;
if ((original_ia != ia) && (original_addr == addr)) {
ifa_ref(&ia->ia_ifa);
- IN_IFADDR_RUNLOCK(&in_ifa_tracker);
+ NET_EPOCH_EXIT(et);
return (ia);
}
}
- IN_IFADDR_RUNLOCK(&in_ifa_tracker);
+ NET_EPOCH_EXIT(et);
return (NULL);
}
@@ -500,10 +496,10 @@ in_aifaddr_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp, struct thread *td)
IF_ADDR_WUNLOCK(ifp);
ifa_ref(ifa); /* in_ifaddrhead */
- IN_IFADDR_WLOCK();
+ sx_assert(&in_control_sx, SA_XLOCKED);
CK_STAILQ_INSERT_TAIL(&V_in_ifaddrhead, ia, ia_link);
- LIST_INSERT_HEAD(INADDR_HASH(ia->ia_addr.sin_addr.s_addr), ia, ia_hash);
- IN_IFADDR_WUNLOCK();
+ CK_LIST_INSERT_HEAD(INADDR_HASH(ia->ia_addr.sin_addr.s_addr), ia,
+ ia_hash);
/*
* Give the interface a chance to initialize
@@ -575,10 +571,9 @@ fail1:
IF_ADDR_WUNLOCK(ifp);
ifa_free(&ia->ia_ifa); /* if_addrhead */
- IN_IFADDR_WLOCK();
+ sx_assert(&in_control_sx, SA_XLOCKED);
CK_STAILQ_REMOVE(&V_in_ifaddrhead, ia, in_ifaddr, ia_link);
- LIST_REMOVE(ia, ia_hash);
- IN_IFADDR_WUNLOCK();
+ CK_LIST_REMOVE(ia, ia_hash);
ifa_free(&ia->ia_ifa); /* in_ifaddrhead */
return (error);
@@ -639,10 +634,9 @@ in_difaddr_ioctl(u_long cmd, caddr_t data, struct ifnet *ifp, struct thread *td)
IF_ADDR_WUNLOCK(ifp);
ifa_free(&ia->ia_ifa); /* if_addrhead */
- IN_IFADDR_WLOCK();
+ sx_assert(&in_control_sx, SA_XLOCKED);
CK_STAILQ_REMOVE(&V_in_ifaddrhead, ia, in_ifaddr, ia_link);
- LIST_REMOVE(ia, ia_hash);
- IN_IFADDR_WUNLOCK();
+ CK_LIST_REMOVE(ia, ia_hash);
/*
* in_scrubprefix() kills the interface route.