summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorDan McDonald <danmcd@joyent.com>2019-02-22 14:42:52 -0500
committerDan McDonald <danmcd@joyent.com>2019-03-02 16:02:09 -0500
commit42c5ef032d8316897a2ba9f9ebf4b9c2654ec345 (patch)
tree24a8b1fe715d034e5aadb9cc7f9b850230300df4 /usr/src
parent573f5931ffa70de78fc2317b82e36d6344cf6c3c (diff)
downloadillumos-joyent-42c5ef032d8316897a2ba9f9ebf4b9c2654ec345.tar.gz
10472 Limit number of multicast NCEs
Reviewed by: Cody Peter Mello <melloc@writev.io> Reviewed by: Jason King <jason.king@joyent.com> Reviewed by: Robert Mustacchi <rm@joyent.com> Reviewed by: Richard Lowe <richlowe@richlowe.net> Approved by: Joshua M. Clulow <josh@sysmgr.org>
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/common/inet/ip.h7
-rw-r--r--usr/src/uts/common/inet/ip/ip.c5
-rw-r--r--usr/src/uts/common/inet/ip/ip_ndp.c292
-rw-r--r--usr/src/uts/common/inet/ip_stack.h23
-rw-r--r--usr/src/uts/intel/ip/ip.global-objs.debug644
-rw-r--r--usr/src/uts/intel/ip/ip.global-objs.obj644
-rw-r--r--usr/src/uts/sparc/ip/ip.global-objs.debug644
-rw-r--r--usr/src/uts/sparc/ip/ip.global-objs.obj644
8 files changed, 313 insertions, 30 deletions
diff --git a/usr/src/uts/common/inet/ip.h b/usr/src/uts/common/inet/ip.h
index 2c1b030309..f67ade9060 100644
--- a/usr/src/uts/common/inet/ip.h
+++ b/usr/src/uts/common/inet/ip.h
@@ -22,9 +22,9 @@
/*
* Copyright (c) 1990 Mentat Inc.
* Copyright (c) 1991, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012, Joyent, Inc. All rights reserved.
* Copyright 2017 Nexenta Systems, Inc.
* Copyright 2017 OmniTI Computer Consulting, Inc. All rights reserved.
+ * Copyright 2019, Joyent, Inc.
*/
#ifndef _INET_IP_H
@@ -1708,7 +1708,8 @@ typedef struct ill_s {
ill_manual_dst_linklocal : 1, /* same for pt-pt dst linklocal */
- ill_pad_bit_31 : 27;
+ ill_mcast_ncec_cleanup : 1, /* Reaping mcast ncecs. */
+ ill_pad_bit_31 : 26;
/*
* Used in SIOCSIFMUXID and SIOCGIFMUXID for 'ifconfig unplumb'.
@@ -1770,6 +1771,7 @@ typedef struct ill_s {
*/
uint_t ill_ifname_pending_err;
avl_node_t ill_avl_byppa; /* avl node based on ppa */
+ uint_t ill_mcast_nces; /* Number of NCEs that are multicast. */
list_t ill_nce; /* pointer to nce_s list */
uint_t ill_refcnt; /* active refcnt by threads */
uint_t ill_ire_cnt; /* ires associated with this ill */
@@ -1940,6 +1942,7 @@ typedef struct ill_s {
* ill_refcnt ill_lock ill_lock
* ill_ire_cnt ill_lock ill_lock
* ill_cv ill_lock ill_lock
+ * ill_mcast_nces ill_lock ill_lock
* ill_ncec_cnt ill_lock ill_lock
* ill_nce_cnt ill_lock ill_lock
* ill_ilm_cnt ill_lock ill_lock
diff --git a/usr/src/uts/common/inet/ip/ip.c b/usr/src/uts/common/inet/ip/ip.c
index 18f67573be..46272b2b22 100644
--- a/usr/src/uts/common/inet/ip/ip.c
+++ b/usr/src/uts/common/inet/ip/ip.c
@@ -24,7 +24,7 @@
* Copyright (c) 1990 Mentat Inc.
* Copyright (c) 2017 OmniTI Computer Consulting, Inc. All rights reserved.
* Copyright (c) 2016 by Delphix. All rights reserved.
- * Copyright (c) 2018 Joyent, Inc. All rights reserved.
+ * Copyright (c) 2019 Joyent, Inc. All rights reserved.
*/
#include <sys/types.h>
@@ -13937,6 +13937,9 @@ ip_kstat2_init(netstackid_t stackid, ip_stat_t *ip_statisticsp)
{ "ip_ire_reclaim_deleted", KSTAT_DATA_UINT64 },
{ "ip_nce_reclaim_calls", KSTAT_DATA_UINT64 },
{ "ip_nce_reclaim_deleted", KSTAT_DATA_UINT64 },
+ { "ip_nce_mcast_reclaim_calls", KSTAT_DATA_UINT64 },
+ { "ip_nce_mcast_reclaim_deleted", KSTAT_DATA_UINT64 },
+ { "ip_nce_mcast_reclaim_tqfail", KSTAT_DATA_UINT64 },
{ "ip_dce_reclaim_calls", KSTAT_DATA_UINT64 },
{ "ip_dce_reclaim_deleted", KSTAT_DATA_UINT64 },
{ "ip_tcp_in_full_hw_cksum_err", KSTAT_DATA_UINT64 },
diff --git a/usr/src/uts/common/inet/ip/ip_ndp.c b/usr/src/uts/common/inet/ip/ip_ndp.c
index 211e56633f..2ab9c6fbca 100644
--- a/usr/src/uts/common/inet/ip/ip_ndp.c
+++ b/usr/src/uts/common/inet/ip/ip_ndp.c
@@ -23,7 +23,7 @@
*/
/*
- * Copyright (c) 2018, Joyent, Inc.
+ * Copyright (c) 2019, Joyent, Inc.
*/
#include <sys/types.h>
@@ -127,8 +127,8 @@ static boolean_t ill_defend_rate_limit(ill_t *, ncec_t *);
static void nce_queue_mp_common(ncec_t *, mblk_t *, boolean_t);
static int nce_add_common(ill_t *, uchar_t *, uint_t, const in6_addr_t *,
uint16_t, uint16_t, nce_t **);
-static nce_t *nce_add_impl(ill_t *, ncec_t *, nce_t *, mblk_t *);
-static nce_t *nce_add(ill_t *, ncec_t *);
+static nce_t *nce_add_impl(ill_t *, ncec_t *, nce_t *, mblk_t *, list_t *);
+static nce_t *nce_add(ill_t *, ncec_t *, list_t *);
static void nce_inactive(nce_t *);
extern nce_t *nce_lookup(ill_t *, const in6_addr_t *);
static nce_t *nce_ill_lookup_then_add(ill_t *, ncec_t *);
@@ -1005,6 +1005,236 @@ ncec_walk(ill_t *ill, ncec_walk_cb_t cbf, void *arg1, ip_stack_t *ipst)
}
/*
+ * Cheesy globals (i.e. all netstacks) for both a limit on per-ill multicast
+ * NCEs, and the number to reclaim if we hit the limit. Used by
+ * nce_set_multicast_v[46]() to limit the linked-list length of ill_nce. Until
+ * we solve the multicast-mappings-shouldn't-be-NCEs problem, use this.
+ */
+
+/* Maximum number of multicast NCEs on an ill. */
+uint_t ip_max_ill_mcast_nces = 16384;
+/*
+ * Number of NCEs to delete if we hit the maximum above. 0 means *don't* and
+ * return an error. Non-zero means delete so many, and if the number is >=
+ * the max above, that means delete them all.
+ */
+uint_t ip_ill_mcast_reclaim = 256;
+
+/*
+ * Encapsulate multicast ill capping in a function, for easier DTrace
+ * detections. Return a list of refheld NCEs to destroy-via-refrele. That
+ * list can be NULL, but can only be non-NULL if we successfully reclaimed.
+ *
+ * NOTE: This function must be called while holding the ill_lock AND
+ * JUST PRIOR to making the insertion into the ill_nce list.
+ *
+ * We can't release the ones we delete ourselves because the ill_lock is held
+ * by the caller. They are, instead, passed back in a list_t for deletion
+ * outside of the ill_lock hold. nce_graveyard_free() actually frees them.
+ *
+ * While this covers nce_t, ncec_t gets done even further down the road. See
+ * nce_graveyard_free() for why.
+ */
+static boolean_t
+nce_too_many_mcast(ill_t *ill, list_t *graveyard)
+{
+ uint_t reclaim_count, max_count, reclaimed = 0;
+ boolean_t too_many;
+ nce_t *nce, *deadman;
+
+ ASSERT(graveyard != NULL);
+ ASSERT(list_is_empty(graveyard));
+ ASSERT(MUTEX_HELD(&ill->ill_lock));
+
+ /*
+ * NOTE: Some grinning weirdo may have lowered the global max beyond
+ * what this ill currently has. The behavior in this case will be
+ * trim-back just by the reclaim amount for any new ones.
+ */
+ max_count = ip_max_ill_mcast_nces;
+ reclaim_count = min(ip_ill_mcast_reclaim, max_count);
+
+ /* All good? */
+ if (ill->ill_mcast_nces < max_count)
+ return (B_FALSE); /* Yes, all good. */
+
+ if (reclaim_count == 0)
+ return (B_TRUE); /* Don't bother - we're stuck. */
+
+ /* We need to reclaim now. Exploit our held ill_lock. */
+
+ /*
+ * Start at the tail and work backwards, new nces are head-inserted,
+ * so we'll be reaping the oldest entries.
+ */
+ nce = list_tail(&ill->ill_nce);
+ while (reclaimed < reclaim_count) {
+ /* Skip ahead to a multicast NCE. */
+ while (nce != NULL &&
+ (nce->nce_common->ncec_flags & NCE_F_MCAST) == 0) {
+ nce = list_prev(&ill->ill_nce, nce);
+ }
+ if (nce == NULL)
+ break;
+
+ /*
+ * NOTE: For now, we just delete the first one(s) we find.
+ * This is not optimal, and may require some inspection of nce
+ * & its ncec to be better.
+ */
+ deadman = nce;
+ nce = list_prev(&ill->ill_nce, nce);
+
+ /* nce_delete() requires caller holds... */
+ nce_refhold(deadman);
+ nce_delete(deadman); /* Bumps down ill_mcast_nces. */
+
+ /* Link the dead ones singly, still refheld... */
+ list_insert_tail(graveyard, deadman);
+ reclaimed++;
+ }
+
+ if (reclaimed != reclaim_count) {
+ /* We didn't have enough to reach reclaim_count. Why?!? */
+ DTRACE_PROBE3(ill__mcast__nce__reclaim__mismatch, ill_t *, ill,
+ uint_t, reclaimed, uint_t, reclaim_count);
+
+ /* In case for some REALLY weird reason we found none! */
+ too_many = (reclaimed == 0);
+ } else {
+ too_many = B_FALSE;
+ }
+
+ return (too_many);
+}
+
+static void
+ncec_mcast_reap_one(ncec_t *ncec, void *arg)
+{
+ boolean_t reapit;
+ ill_t *ill = (ill_t *)arg;
+
+ /* Obvious no-lock-needed checks... */
+ if (ncec == NULL || ncec->ncec_ill != ill ||
+ (ncec->ncec_flags & NCE_F_MCAST) == 0)
+ return;
+
+ mutex_enter(&ncec->ncec_lock);
+ /*
+ * It's refheld by the walk infrastructure. It has one reference for
+ * being in the ndp_g_hash, and if an nce_t exists, that's one more.
+ * We want ones without an nce_t, so 2 is the magic number. If it's
+ * LESS than 2, we have much bigger problems anyway.
+ */
+ ASSERT(ncec->ncec_refcnt >= 2);
+ reapit = (ncec->ncec_refcnt == 2);
+ mutex_exit(&ncec->ncec_lock);
+
+ if (reapit) {
+ IP_STAT(ill->ill_ipst, ip_nce_mcast_reclaim_deleted);
+ ncec_delete(ncec);
+ }
+}
+
+/*
+ * Attempt to reap stray multicast ncec_t structures left in the wake of
+ * nce_graveyard_free(). This is a taskq servicing routine, as it's well
+ * outside any netstack-global locks being held - ndp_g_lock in this case. We
+ * have a reference hold on the ill, which will prevent any unplumbing races.
+ */
+static void
+ncec_mcast_reap(void *arg)
+{
+ ill_t *ill = (ill_t *)arg;
+
+ IP_STAT(ill->ill_ipst, ip_nce_mcast_reclaim_calls);
+ ncec_walk(ill, ncec_mcast_reap_one, ill, ill->ill_ipst);
+ mutex_enter(&ill->ill_lock);
+ ill->ill_mcast_ncec_cleanup = B_FALSE;
+ /*
+ * Inline a _notr() version of ill_refrele. See nce_graveyard_free()
+ * below for why.
+ */
+ ill->ill_refcnt--;
+ if (ill->ill_refcnt == 0)
+ ipif_ill_refrele_tail(ill); /* Drops ill_lock. */
+ else
+ mutex_exit(&ill->ill_lock);
+}
+
+/*
+ * Free a list (including handling an empty list or NULL list) of
+ * reference-held NCEs that were reaped from a nce_too_many_mcast()
+ * call. Separate because the caller must have dropped ndp_g_lock first.
+ *
+ * This also schedules a taskq task to unlink underlying NCECs from the
+ * ndp_g_hash, which are protected by ndp_g_lock.
+ */
+static void
+nce_graveyard_free(list_t *graveyard)
+{
+ nce_t *deadman, *current;
+ ill_t *ill;
+ boolean_t doit;
+
+ if (graveyard == NULL)
+ return;
+
+ current = list_head(graveyard);
+ if (current == NULL) {
+ list_destroy(graveyard);
+ return;
+ }
+
+ ill = current->nce_ill;
+ /*
+ * Normally one should ill_refhold(ill) here. There's no _notr()
+ * variant like there is for ire_t, dce_t, or even ncec_t, but this is
+ * the ONLY case that'll break the mh_trace that IP debugging uses for
+ * reference counts (i.e. they assume same thread releases as
+ * holds). Instead, we inline ill_refhold() here. We must do the same
+ * in the release done by the ncec_mcast_reap() above.
+ */
+ mutex_enter(&ill->ill_lock);
+ ill->ill_refcnt++;
+ mutex_exit(&ill->ill_lock);
+
+ while (current != NULL) {
+ ASSERT3P(ill, ==, current->nce_ill);
+ deadman = current;
+ current = list_next(graveyard, deadman);
+ list_remove(graveyard, deadman);
+ ASSERT3U((deadman->nce_common->ncec_flags & NCE_F_MCAST), !=,
+ 0);
+ nce_refrele(deadman);
+ }
+ list_destroy(graveyard);
+
+ mutex_enter(&ill->ill_lock);
+ if (ill->ill_mcast_ncec_cleanup)
+ doit = B_FALSE;
+ else {
+ ill->ill_mcast_ncec_cleanup = B_TRUE;
+ doit = B_TRUE;
+ }
+ mutex_exit(&ill->ill_lock);
+ if (!doit || taskq_dispatch(system_taskq, ncec_mcast_reap,
+ ill, TQ_NOSLEEP) == NULL) {
+ mutex_enter(&ill->ill_lock);
+ if (doit) {
+ IP_STAT(ill->ill_ipst, ip_nce_mcast_reclaim_tqfail);
+ ill->ill_mcast_ncec_cleanup = B_FALSE;
+ }
+ /* There's no _notr() for ill_refrele(), so inline it here. */
+ ill->ill_refcnt--;
+ if (ill->ill_refcnt == 0)
+ ipif_ill_refrele_tail(ill); /* Drops ill_lock */
+ else
+ mutex_exit(&ill->ill_lock);
+ }
+}
+
+/*
* For each interface an entry is added for the unspecified multicast group.
* Here that mapping is used to form the multicast cache entry for a particular
* multicast destination.
@@ -1050,7 +1280,7 @@ nce_set_multicast_v6(ill_t *ill, const in6_addr_t *dst,
ND_UNCHANGED, &nce);
mutex_exit(&ipst->ips_ndp6->ndp_g_lock);
if (err == 0)
- err = nce_add_v6_postprocess(nce);
+ err = (nce != NULL) ? nce_add_v6_postprocess(nce) : ENOMEM;
if (hw_addr != NULL)
kmem_free(hw_addr, ill->ill_nd_lla_len);
if (err != 0) {
@@ -3100,7 +3330,7 @@ nce_fastpath_create(ill_t *ill, ncec_t *ncec)
* method. All other callers (that pass in NULL ncec_nce) will have to do a
* nce_refrele of the returned nce (when it is non-null).
*/
-nce_t *
+static nce_t *
nce_fastpath(ncec_t *ncec, boolean_t trigger_fp_req, nce_t *ncec_nce)
{
nce_t *nce;
@@ -3158,7 +3388,7 @@ nce_fastpath_trigger(nce_t *nce)
* Add ncec to the nce fastpath list on ill.
*/
static nce_t *
-nce_ill_lookup_then_add_locked(ill_t *ill, ncec_t *ncec)
+nce_ill_lookup_then_add_locked(ill_t *ill, ncec_t *ncec, list_t *graveyard)
{
nce_t *nce = NULL;
@@ -3178,21 +3408,24 @@ nce_ill_lookup_then_add_locked(ill_t *ill, ncec_t *ncec)
nce = nce_lookup(ill, &ncec->ncec_addr);
if (nce != NULL)
goto done;
- nce = nce_add(ill, ncec);
+ nce = nce_add(ill, ncec, graveyard);
}
done:
mutex_exit(&ncec->ncec_lock);
return (nce);
}
-nce_t *
+static nce_t *
nce_ill_lookup_then_add(ill_t *ill, ncec_t *ncec)
{
nce_t *nce;
+ list_t graveyard;
+ list_create(&graveyard, sizeof (nce_t), offsetof(nce_t, nce_node));
mutex_enter(&ill->ill_lock);
- nce = nce_ill_lookup_then_add_locked(ill, ncec);
+ nce = nce_ill_lookup_then_add_locked(ill, ncec, &graveyard);
mutex_exit(&ill->ill_lock);
+ nce_graveyard_free(&graveyard);
return (nce);
}
@@ -3243,7 +3476,9 @@ nce_delete_then_add(nce_t *nce)
{
ill_t *ill = nce->nce_ill;
nce_t *newnce = NULL;
+ list_t graveyard;
+ list_create(&graveyard, sizeof (nce_t), offsetof(nce_t, nce_node));
ip0dbg(("nce_delete_then_add nce %p ill %s\n",
(void *)nce, ill->ill_name));
mutex_enter(&ill->ill_lock);
@@ -3255,9 +3490,10 @@ nce_delete_then_add(nce_t *nce)
* ipmp_ncec_delete_nce()
*/
if (!NCE_ISCONDEMNED(nce->nce_common))
- newnce = nce_add(ill, nce->nce_common);
+ newnce = nce_add(ill, nce->nce_common, &graveyard);
mutex_exit(&nce->nce_common->ncec_lock);
mutex_exit(&ill->ill_lock);
+ nce_graveyard_free(&graveyard);
nce_refrele(nce);
return (newnce); /* could be null if nomem */
}
@@ -3972,7 +4208,7 @@ nce_set_multicast_v4(ill_t *ill, const in_addr_t *dst,
ND_UNCHANGED, &nce);
mutex_exit(&ipst->ips_ndp4->ndp_g_lock);
if (err == 0)
- err = nce_add_v4_postprocess(nce);
+ err = (nce != NULL) ? nce_add_v4_postprocess(nce) : ENOMEM;
if (hw_addr != NULL)
kmem_free(hw_addr, ill->ill_phys_addr_length);
if (err != 0) {
@@ -4396,6 +4632,7 @@ nce_add_common(ill_t *ill, uchar_t *hw_addr, uint_t hw_addr_len,
boolean_t fastprobe = B_FALSE;
struct ndp_g_s *ndp;
nce_t *nce = NULL;
+ list_t graveyard;
mblk_t *dlur_mp = NULL;
if (ill->ill_isv6)
@@ -4686,9 +4923,11 @@ nce_add_common(ill_t *ill, uchar_t *hw_addr, uint_t hw_addr_len,
* Since we hold the ncec_lock at this time, the ncec cannot be
* condemned, and we can safely add the nce.
*/
- *retnce = nce_add_impl(ill, ncec, nce, dlur_mp);
+ list_create(&graveyard, sizeof (nce_t), offsetof(nce_t, nce_node));
+ *retnce = nce_add_impl(ill, ncec, nce, dlur_mp, &graveyard);
mutex_exit(&ncec->ncec_lock);
mutex_exit(&ill->ill_lock);
+ nce_graveyard_free(&graveyard);
/* caller must trigger fastpath on *retnce */
return (0);
@@ -4774,10 +5013,25 @@ nce_inactive(nce_t *nce)
/*
* Add an nce to the ill_nce list.
+ *
+ * Adding multicast NCEs is subject to a per-ill limit. This function returns
+ * NULL if that's the case, and it may reap a number of multicast nces.
+ * Callers (and upstack) must be able to cope with NULL returns.
*/
static nce_t *
-nce_add_impl(ill_t *ill, ncec_t *ncec, nce_t *nce, mblk_t *dlur_mp)
+nce_add_impl(ill_t *ill, ncec_t *ncec, nce_t *nce, mblk_t *dlur_mp,
+ list_t *graveyard)
{
+ ASSERT(MUTEX_HELD(&ill->ill_lock));
+
+ if ((ncec->ncec_flags & NCE_F_MCAST) != 0) {
+ if (nce_too_many_mcast(ill, graveyard)) {
+ kmem_cache_free(nce_cache, nce);
+ return (NULL);
+ }
+ ill->ill_mcast_nces++;
+ }
+
bzero(nce, sizeof (*nce));
mutex_init(&nce->nce_lock, NULL, MUTEX_DEFAULT, NULL);
nce->nce_common = ncec;
@@ -4798,7 +5052,7 @@ nce_add_impl(ill_t *ill, ncec_t *ncec, nce_t *nce, mblk_t *dlur_mp)
}
static nce_t *
-nce_add(ill_t *ill, ncec_t *ncec)
+nce_add(ill_t *ill, ncec_t *ncec, list_t *graveyard)
{
nce_t *nce;
mblk_t *dlur_mp = NULL;
@@ -4819,7 +5073,11 @@ nce_add(ill_t *ill, ncec_t *ncec)
return (NULL);
}
}
- return (nce_add_impl(ill, ncec, nce, dlur_mp));
+ /*
+ * If nce_add_impl() returns NULL due to on multicast limiting, caller
+ * will (correctly) assume ENOMEM.
+ */
+ return (nce_add_impl(ill, ncec, nce, dlur_mp, graveyard));
}
/*
@@ -4843,6 +5101,10 @@ nce_delete(nce_t *nce)
nce->nce_is_condemned = B_TRUE;
mutex_exit(&nce->nce_lock);
+ /* Update the count of multicast NCEs. */
+ if ((nce->nce_common->ncec_flags & NCE_F_MCAST) == NCE_F_MCAST)
+ ill->ill_mcast_nces--;
+
list_remove(&ill->ill_nce, nce);
/*
* even though we are holding the ill_lock, it is ok to
diff --git a/usr/src/uts/common/inet/ip_stack.h b/usr/src/uts/common/inet/ip_stack.h
index ab954c7c31..85885f9dd9 100644
--- a/usr/src/uts/common/inet/ip_stack.h
+++ b/usr/src/uts/common/inet/ip_stack.h
@@ -24,6 +24,10 @@
* Use is subject to license terms.
*/
+/*
+ * Copyright 2019 Joyent, Inc.
+ */
+
#ifndef _INET_IP_STACK_H
#define _INET_IP_STACK_H
@@ -64,6 +68,9 @@ typedef struct ip_stat {
kstat_named_t ip_ire_reclaim_deleted;
kstat_named_t ip_nce_reclaim_calls;
kstat_named_t ip_nce_reclaim_deleted;
+ kstat_named_t ip_nce_mcast_reclaim_calls;
+ kstat_named_t ip_nce_mcast_reclaim_deleted;
+ kstat_named_t ip_nce_mcast_reclaim_tqfail;
kstat_named_t ip_dce_reclaim_calls;
kstat_named_t ip_dce_reclaim_deleted;
kstat_named_t ip_tcp_in_full_hw_cksum_err;
@@ -143,7 +150,7 @@ struct ip_stack {
uint_t ips_src_generation; /* Both IPv4 and IPv6 */
- struct mod_prop_info_s *ips_propinfo_tbl; /* ip tunables table */
+ struct mod_prop_info_s *ips_propinfo_tbl; /* ip tunables table */
mib2_ipIfStatsEntry_t ips_ip_mib; /* SNMP fixed size info */
mib2_icmp_t ips_icmp_mib;
@@ -200,16 +207,16 @@ struct ip_stack {
/* ip.c */
/* Following protected by igmp_timer_lock */
- int ips_igmp_time_to_next; /* Time since last timeout */
- int ips_igmp_timer_scheduled_last;
+ int ips_igmp_time_to_next; /* Time since last timeout */
+ int ips_igmp_timer_scheduled_last;
int ips_igmp_deferred_next;
timeout_id_t ips_igmp_timeout_id;
boolean_t ips_igmp_timer_setter_active;
boolean_t ips_igmp_timer_quiesce;
/* Following protected by mld_timer_lock */
- int ips_mld_time_to_next; /* Time since last timeout */
- int ips_mld_timer_scheduled_last;
+ int ips_mld_time_to_next; /* Time since last timeout */
+ int ips_mld_timer_scheduled_last;
int ips_mld_deferred_next;
timeout_id_t ips_mld_timeout_id;
boolean_t ips_mld_timer_setter_active;
@@ -247,8 +254,8 @@ struct ip_stack {
uint32_t ips_ip6_ftable_hash_size;
- ire_stats_t ips_ire_stats_v4; /* IPv4 ire statistics */
- ire_stats_t ips_ire_stats_v6; /* IPv6 ire statistics */
+ ire_stats_t ips_ire_stats_v4; /* IPv4 ire statistics */
+ ire_stats_t ips_ire_stats_v6; /* IPv6 ire statistics */
/* Count how many condemned objects for kmem_cache callbacks */
uint32_t ips_num_ire_condemned;
@@ -344,7 +351,7 @@ struct ip_stack {
* reg_vif_num is protected by numvifs_mutex
*/
/* Whether or not special PIM assert processing is enabled. */
- ushort_t ips_reg_vif_num; /* Index to Register vif */
+ ushort_t ips_reg_vif_num; /* Index to Register vif */
int ips_pim_assert;
union ill_g_head_u *ips_ill_g_heads; /* ILL List Head */
diff --git a/usr/src/uts/intel/ip/ip.global-objs.debug64 b/usr/src/uts/intel/ip/ip.global-objs.debug64
index 3098f98265..6aa8cc87d3 100644
--- a/usr/src/uts/intel/ip/ip.global-objs.debug64
+++ b/usr/src/uts/intel/ip/ip.global-objs.debug64
@@ -21,7 +21,7 @@
#
# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
# Copyright 2011 Nexenta Systems, Inc. All rights reserved
-# Copyright 2012 Joyent, Inc. All rights reserved
+# Copyright 2019 Joyent, Inc. All rights reserved
#
arp_m_tbl
@@ -119,11 +119,13 @@ ip_g_all_ones
ip_helper_stream_info
ip_helper_stream_rinit
ip_helper_stream_winit
+ip_ill_mcast_reclaim
ip_ioctl_ftbl
ip_loopback_mtu_v6plus
ip_loopback_mtuplus
ip_m_tbl
ip_max_frag_dups
+ip_max_ill_mcast_nces
ip_min_frag_prune_time
ip_minor_arena_la
ip_minor_arena_sa
diff --git a/usr/src/uts/intel/ip/ip.global-objs.obj64 b/usr/src/uts/intel/ip/ip.global-objs.obj64
index f182d7198e..7e7d1a2833 100644
--- a/usr/src/uts/intel/ip/ip.global-objs.obj64
+++ b/usr/src/uts/intel/ip/ip.global-objs.obj64
@@ -21,7 +21,7 @@
#
# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
# Copyright 2011 Nexenta Systems, Inc. All rights reserved
-# Copyright 2012 Joyent, Inc. All rights reserved
+# Copyright 2019 Joyent, Inc. All rights reserved
#
arp_m_tbl
@@ -119,11 +119,13 @@ ip_g_all_ones
ip_helper_stream_info
ip_helper_stream_rinit
ip_helper_stream_winit
+ip_ill_mcast_reclaim
ip_ioctl_ftbl
ip_loopback_mtu_v6plus
ip_loopback_mtuplus
ip_m_tbl
ip_max_frag_dups
+ip_max_ill_mcast_nces
ip_min_frag_prune_time
ip_minor_arena_la
ip_minor_arena_sa
diff --git a/usr/src/uts/sparc/ip/ip.global-objs.debug64 b/usr/src/uts/sparc/ip/ip.global-objs.debug64
index 3098f98265..6aa8cc87d3 100644
--- a/usr/src/uts/sparc/ip/ip.global-objs.debug64
+++ b/usr/src/uts/sparc/ip/ip.global-objs.debug64
@@ -21,7 +21,7 @@
#
# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
# Copyright 2011 Nexenta Systems, Inc. All rights reserved
-# Copyright 2012 Joyent, Inc. All rights reserved
+# Copyright 2019 Joyent, Inc. All rights reserved
#
arp_m_tbl
@@ -119,11 +119,13 @@ ip_g_all_ones
ip_helper_stream_info
ip_helper_stream_rinit
ip_helper_stream_winit
+ip_ill_mcast_reclaim
ip_ioctl_ftbl
ip_loopback_mtu_v6plus
ip_loopback_mtuplus
ip_m_tbl
ip_max_frag_dups
+ip_max_ill_mcast_nces
ip_min_frag_prune_time
ip_minor_arena_la
ip_minor_arena_sa
diff --git a/usr/src/uts/sparc/ip/ip.global-objs.obj64 b/usr/src/uts/sparc/ip/ip.global-objs.obj64
index f182d7198e..7e7d1a2833 100644
--- a/usr/src/uts/sparc/ip/ip.global-objs.obj64
+++ b/usr/src/uts/sparc/ip/ip.global-objs.obj64
@@ -21,7 +21,7 @@
#
# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
# Copyright 2011 Nexenta Systems, Inc. All rights reserved
-# Copyright 2012 Joyent, Inc. All rights reserved
+# Copyright 2019 Joyent, Inc. All rights reserved
#
arp_m_tbl
@@ -119,11 +119,13 @@ ip_g_all_ones
ip_helper_stream_info
ip_helper_stream_rinit
ip_helper_stream_winit
+ip_ill_mcast_reclaim
ip_ioctl_ftbl
ip_loopback_mtu_v6plus
ip_loopback_mtuplus
ip_m_tbl
ip_max_frag_dups
+ip_max_ill_mcast_nces
ip_min_frag_prune_time
ip_minor_arena_la
ip_minor_arena_sa