--- old/usr/src/uts/common/inet/ip.h	Wed Feb 27 19:46:38 2019
+++ new/usr/src/uts/common/inet/ip.h	Wed Feb 27 19:46:38 2019
@@ -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 @@
 
 		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 @@
 	 */
 	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 @@
  * 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
--- old/usr/src/uts/common/inet/ip/ip.c	Wed Feb 27 19:46:38 2019
+++ new/usr/src/uts/common/inet/ip/ip.c	Wed Feb 27 19:46:38 2019
@@ -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_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 },
--- old/usr/src/uts/common/inet/ip/ip_ndp.c	Wed Feb 27 19:46:39 2019
+++ new/usr/src/uts/common/inet/ip/ip_ndp.c	Wed Feb 27 19:46:39 2019
@@ -23,7 +23,7 @@
  */
 
 /*
- * Copyright (c) 2018, Joyent, Inc.
+ * Copyright (c) 2019, Joyent, Inc.
  */
 
 #include <sys/types.h>
@@ -127,8 +127,8 @@
 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 @@
 }
 
 /*
+ * 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 @@
 	    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 @@
  * 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 @@
  * 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,7 +3408,7 @@
 		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);
@@ -3185,14 +3415,17 @@
 	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 @@
 {
 	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 @@
 	 * 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 @@
 	    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 @@
 	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 @@
 	 * 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 @@
 
 /*
  * 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 @@
 }
 
 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 @@
 			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->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
--- old/usr/src/uts/common/inet/ip_stack.h	Wed Feb 27 19:46:39 2019
+++ new/usr/src/uts/common/inet/ip_stack.h	Wed Feb 27 19:46:39 2019
@@ -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 @@
 	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 @@
 
 	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,8 +207,8 @@
 
 /* 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;
@@ -208,8 +215,8 @@
 	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 @@
 
 	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 @@
 	 * 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 */
--- old/usr/src/uts/intel/ip/ip.global-objs.debug64	Wed Feb 27 19:46:39 2019
+++ new/usr/src/uts/intel/ip/ip.global-objs.debug64	Wed Feb 27 19:46:39 2019
@@ -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_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
--- old/usr/src/uts/intel/ip/ip.global-objs.obj64	Wed Feb 27 19:46:39 2019
+++ new/usr/src/uts/intel/ip/ip.global-objs.obj64	Wed Feb 27 19:46:39 2019
@@ -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_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
--- old/usr/src/uts/sparc/ip/ip.global-objs.debug64	Wed Feb 27 19:46:40 2019
+++ new/usr/src/uts/sparc/ip/ip.global-objs.debug64	Wed Feb 27 19:46:40 2019
@@ -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_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
--- old/usr/src/uts/sparc/ip/ip.global-objs.obj64	Wed Feb 27 19:46:40 2019
+++ new/usr/src/uts/sparc/ip/ip.global-objs.obj64	Wed Feb 27 19:46:40 2019
@@ -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_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
