Page MenuHomeFreeBSD

D55599.id.diff
No OneTemporary

D55599.id.diff

diff --git a/sys/netinet6/in6.h b/sys/netinet6/in6.h
--- a/sys/netinet6/in6.h
+++ b/sys/netinet6/in6.h
@@ -689,6 +689,7 @@
struct sockaddr_in6 *sin6);
void in6_sin6_2_sin_in_sock(struct sockaddr *nam);
extern void addrsel_policy_init(void);
+extern void addrsel_policy_destroy(void);
#define satosin6(sa) ((struct sockaddr_in6 *)(sa))
#define sin6tosa(sin6) ((struct sockaddr *)(sin6))
diff --git a/sys/netinet6/in6_src.c b/sys/netinet6/in6_src.c
--- a/sys/netinet6/in6_src.c
+++ b/sys/netinet6/in6_src.c
@@ -107,12 +107,15 @@
static struct mtx addrsel_lock;
#define ADDRSEL_LOCK_INIT() mtx_init(&addrsel_lock, "addrsel_lock", NULL, MTX_DEF)
+#define ADDRSEL_LOCK_DESTROY() mtx_destroy(&addrsel_lock)
#define ADDRSEL_LOCK() mtx_lock(&addrsel_lock)
#define ADDRSEL_UNLOCK() mtx_unlock(&addrsel_lock)
#define ADDRSEL_LOCK_ASSERT() mtx_assert(&addrsel_lock, MA_OWNED)
static struct sx addrsel_sxlock;
#define ADDRSEL_SXLOCK_INIT() sx_init(&addrsel_sxlock, "addrsel_sxlock")
+#define ADDRSEL_SXLOCK_DESTROY() \
+ sx_destroy(&addrsel_sxlock)
#define ADDRSEL_SLOCK() sx_slock(&addrsel_sxlock)
#define ADDRSEL_SUNLOCK() sx_sunlock(&addrsel_sxlock)
#define ADDRSEL_XLOCK() sx_xlock(&addrsel_sxlock)
@@ -137,6 +140,7 @@
static struct in6_addrpolicy *lookup_addrsel_policy(struct sockaddr_in6 *);
static void init_policy_queue(void);
+static void destroy_policy_queue(void);
static int add_addrsel_policyent(struct in6_addrpolicy *);
static int delete_addrsel_policyent(struct in6_addrpolicy *);
static int walk_addrsel_policy(int (*)(struct in6_addrpolicy *, void *),
@@ -903,6 +907,19 @@
ADDRSEL_SXLOCK_INIT();
}
+void
+addrsel_policy_destroy(void)
+{
+
+ destroy_policy_queue();
+
+ if (!IS_DEFAULT_VNET(curvnet))
+ return;
+
+ ADDRSEL_LOCK_DESTROY();
+ ADDRSEL_SXLOCK_DESTROY();
+}
+
static struct in6_addrpolicy *
lookup_addrsel_policy(struct sockaddr_in6 *key)
{
@@ -999,6 +1016,17 @@
TAILQ_INIT(&V_addrsel_policytab);
}
+static void
+destroy_policy_queue(void)
+{
+ struct addrsel_policyent *pol, *tpol;
+
+ TAILQ_FOREACH_SAFE(pol, &V_addrsel_policytab, ape_entry, tpol) {
+ TAILQ_REMOVE(&V_addrsel_policytab, pol, ape_entry);
+ free(pol, M_IFADDR);
+ }
+}
+
static int
add_addrsel_policyent(struct in6_addrpolicy *newpolicy)
{
diff --git a/sys/netinet6/ip6_input.c b/sys/netinet6/ip6_input.c
--- a/sys/netinet6/ip6_input.c
+++ b/sys/netinet6/ip6_input.c
@@ -399,6 +399,7 @@
frag6_destroy();
nd6_destroy();
+ addrsel_policy_destroy();
in6_ifattach_destroy();
hashdestroy(V_in6_ifaddrhashtbl, M_IFADDR, V_in6_ifaddrhmask);

File Metadata

Mime Type
text/plain
Expires
Sat, Apr 18, 2:35 PM (10 h, 37 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31724089
Default Alt Text
D55599.id.diff (2 KB)

Event Timeline