diff options
| author | Dan McDonald <danmcd@joyent.com> | 2019-02-22 14:42:52 -0500 |
|---|---|---|
| committer | Dan McDonald <danmcd@joyent.com> | 2019-03-02 16:02:09 -0500 |
| commit | 42c5ef032d8316897a2ba9f9ebf4b9c2654ec345 (patch) | |
| tree | 24a8b1fe715d034e5aadb9cc7f9b850230300df4 /usr/src | |
| parent | 573f5931ffa70de78fc2317b82e36d6344cf6c3c (diff) | |
| download | illumos-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.h | 7 | ||||
| -rw-r--r-- | usr/src/uts/common/inet/ip/ip.c | 5 | ||||
| -rw-r--r-- | usr/src/uts/common/inet/ip/ip_ndp.c | 292 | ||||
| -rw-r--r-- | usr/src/uts/common/inet/ip_stack.h | 23 | ||||
| -rw-r--r-- | usr/src/uts/intel/ip/ip.global-objs.debug64 | 4 | ||||
| -rw-r--r-- | usr/src/uts/intel/ip/ip.global-objs.obj64 | 4 | ||||
| -rw-r--r-- | usr/src/uts/sparc/ip/ip.global-objs.debug64 | 4 | ||||
| -rw-r--r-- | usr/src/uts/sparc/ip/ip.global-objs.obj64 | 4 |
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 |
