diff options
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/common/inet/ip.h | 3 | ||||
-rw-r--r-- | usr/src/uts/common/inet/ip/ip.c | 2 | ||||
-rw-r--r-- | usr/src/uts/common/inet/ip/ip_if.c | 74 | ||||
-rw-r--r-- | usr/src/uts/common/inet/ip/ip_ire.c | 303 | ||||
-rw-r--r-- | usr/src/uts/common/inet/ip/ip_ndp.c | 40 | ||||
-rw-r--r-- | usr/src/uts/common/inet/ip_ire.h | 9 | ||||
-rw-r--r-- | usr/src/uts/common/inet/ip_ndp.h | 4 |
7 files changed, 56 insertions, 379 deletions
diff --git a/usr/src/uts/common/inet/ip.h b/usr/src/uts/common/inet/ip.h index 909a1a71a2..ab4e145aed 100644 --- a/usr/src/uts/common/inet/ip.h +++ b/usr/src/uts/common/inet/ip.h @@ -20,7 +20,7 @@ */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* Copyright (c) 1990 Mentat Inc. */ @@ -2519,7 +2519,6 @@ typedef struct ire_s { ipaddr_t ire_in_src_addr; /* source ip-addr of incoming packet */ clock_t ire_last_used_time; /* Last used time */ - struct ire_s *ire_fastpath; /* Pointer to next ire in fastpath */ tsol_ire_gw_secattr_t *ire_gw_secattr; /* gateway security attributes */ zoneid_t ire_zoneid; /* for local address discrimination */ /* diff --git a/usr/src/uts/common/inet/ip/ip.c b/usr/src/uts/common/inet/ip/ip.c index d3ed41cf45..f94130944a 100644 --- a/usr/src/uts/common/inet/ip/ip.c +++ b/usr/src/uts/common/inet/ip/ip.c @@ -27681,7 +27681,7 @@ nak: nce->nce_res_mp = mp1; nce->nce_state = ND_REACHABLE; mutex_exit(&nce->nce_lock); - ire_fastpath(ire); + nce_fastpath(nce); } /* * The cached nce_t has been updated to be reachable; diff --git a/usr/src/uts/common/inet/ip/ip_if.c b/usr/src/uts/common/inet/ip/ip_if.c index 32367adb79..7868efa93d 100644 --- a/usr/src/uts/common/inet/ip/ip_if.c +++ b/usr/src/uts/common/inet/ip/ip_if.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* Copyright (c) 1990 Mentat Inc. */ @@ -1765,11 +1765,7 @@ ill_downi_mrtun_srcif(ire_t *ire, char *ill_arg) void ill_fastpath_nack(ill_t *ill) { - if (ill->ill_isv6) { - nce_fastpath_list_dispatch(ill, NULL, NULL); - } else { - ire_fastpath_list_dispatch(ill, NULL, NULL); - } + nce_fastpath_list_dispatch(ill, NULL, NULL); } /* Consume an M_IOCACK of the fastpath probe. */ @@ -1796,38 +1792,7 @@ ill_fastpath_ack(ill_t *ill, mblk_t *mp) * Update all IRE's or NCE's that are waiting for * fastpath update. */ - if (ill->ill_isv6) { - /* - * update nce's in the fastpath list. - */ - nce_fastpath_list_dispatch(ill, - ndp_fastpath_update, mp); - } else { - - /* - * update ire's in the fastpath list. - */ - ire_fastpath_list_dispatch(ill, - ire_fastpath_update, mp); - /* - * Check if we need to traverse reverse tunnel table. - * Since there is only single ire_type (IRE_MIPRTUN) - * in the table, we don't need to match on ire_type. - * We have to check ire_mrtun_count and not the - * ill_mrtun_refcnt since ill_mrtun_refcnt is set - * on the incoming ill and here we are dealing with - * outgoing ill. - */ - mutex_enter(&ire_mrtun_lock); - if (ire_mrtun_count != 0) { - mutex_exit(&ire_mrtun_lock); - ire_walk_ill_mrtun(MATCH_IRE_WQ, IRE_MIPRTUN, - (void (*)(ire_t *, void *)) - ire_fastpath_update, mp, ill); - } else { - mutex_exit(&ire_mrtun_lock); - } - } + nce_fastpath_list_dispatch(ill, ndp_fastpath_update, mp); mp1 = mp->b_cont; freeb(mp); mp = mp1; @@ -15470,10 +15435,8 @@ redo: clear_ire->ire_marks |= IRE_MARK_CONDEMNED; irb->irb_marks |= IRB_MARK_CONDEMNED; - if (clear_ire_stq != NULL) { - ire_fastpath_list_delete( - (ill_t *)clear_ire_stq->ire_stq->q_ptr, - clear_ire_stq); + if (clear_ire_stq != NULL && clear_ire_stq->ire_nce != NULL) { + nce_fastpath_list_delete(clear_ire_stq->ire_nce); clear_ire_stq->ire_marks |= IRE_MARK_CONDEMNED; } @@ -24267,30 +24230,17 @@ ipif_getby_indexes(uint_t ifindex, uint_t lifidx, boolean_t isv6) } /* - * Flush the fastpath by deleting any IRE's that are waiting for the fastpath, - * and any IRE's that are using the fastpath. There are two exceptions: - * IRE_MIPRTUN and IRE_BROADCAST are difficult to recreate, so instead we just - * nuke their nce_fp_mp's; see ire_fastpath_flush() for details. + * Flush the fastpath by deleting any nce's that are waiting for the fastpath, + * There is one exceptions IRE_BROADCAST are difficult to recreate, + * so instead we just nuke their nce_fp_mp's; see ndp_fastpath_flush() + * for details. */ void ill_fastpath_flush(ill_t *ill) { - if (ill->ill_isv6) { - nce_fastpath_list_dispatch(ill, NULL, NULL); - ndp_walk(ill, (pfi_t)ndp_fastpath_flush, NULL); - } else { - ire_fastpath_list_dispatch(ill, NULL, NULL); - ire_walk_ill_v4(MATCH_IRE_WQ | MATCH_IRE_TYPE, - IRE_CACHE | IRE_BROADCAST, ire_fastpath_flush, NULL, ill); - mutex_enter(&ire_mrtun_lock); - if (ire_mrtun_count != 0) { - mutex_exit(&ire_mrtun_lock); - ire_walk_ill_mrtun(MATCH_IRE_WQ, IRE_MIPRTUN, - ire_fastpath_flush, NULL, ill); - } else { - mutex_exit(&ire_mrtun_lock); - } - } + nce_fastpath_list_dispatch(ill, NULL, NULL); + ndp_walk_common((ill->ill_isv6 ? &ndp6 : &ndp4), ill, + (pfi_t)ndp_fastpath_flush, NULL, B_TRUE); } /* diff --git a/usr/src/uts/common/inet/ip/ip_ire.c b/usr/src/uts/common/inet/ip/ip_ire.c index 62ef6b603e..31e51a6b51 100644 --- a/usr/src/uts/common/inet/ip/ip_ire.c +++ b/usr/src/uts/common/inet/ip/ip_ire.c @@ -399,7 +399,6 @@ static void ire_walk_ill_ipvers(uint_t match_flags, uint_t ire_type, pfv_t func, void *arg, uchar_t vers, ill_t *ill); static void ire_cache_cleanup(irb_t *irb, uint32_t threshold, int cnt); extern void ill_unlock_ills(ill_t **list, int cnt); -static void ire_fastpath_list_add(ill_t *ill, ire_t *ire); static void ip_nce_clookup_and_delete(nce_t *nce, void *arg); extern void th_trace_rrecord(th_trace_t *); #ifdef IRE_DEBUG @@ -2139,284 +2138,6 @@ ire_expire(ire_t *ire, char *arg) } /* - * Do fast path probing if necessary. - */ -void -ire_fastpath(ire_t *ire) -{ - ill_t *ill; - int res; - - if (ire->ire_nce == NULL || ire->ire_nce->nce_fp_mp != NULL || - ire->ire_nce->nce_state != ND_REACHABLE || - ire->ire_nce->nce_res_mp == NULL) { - - /* - * Already contains fastpath info or - * doesn't have DL_UNITDATA_REQ header or - * or is an incomplete ire in the ire table - * or is a loopback broadcast ire i.e. no stq. - */ - return; - } - ill = ire_to_ill(ire); - if (ill == NULL) - return; - ire_fastpath_list_add(ill, ire); - res = ill_fastpath_probe(ill, ire->ire_nce->nce_res_mp); - /* - * EAGAIN is an indication of a transient error - * i.e. allocation failure etc. leave the ire in the list it will - * be updated when another probe happens for another ire if not - * it will be taken out of the list when the ire is deleted. - */ - if (res != 0 && res != EAGAIN) - ire_fastpath_list_delete(ill, ire); -} - -/* - * Update all IRE's that are not in fastpath mode and - * have an dlureq_mp that matches mp. mp->b_cont contains - * the fastpath header. - * - * Returns TRUE if entry should be dequeued, or FALSE otherwise. - */ -boolean_t -ire_fastpath_update(ire_t *ire, void *arg) -{ - mblk_t *mp, *fp_mp; - uchar_t *up, *up2; - ptrdiff_t cmplen; - nce_t *arpce; - - ASSERT((ire->ire_type & (IRE_CACHE | IRE_BROADCAST | - IRE_MIPRTUN)) != 0); - - /* - * Already contains fastpath info or doesn't have - * DL_UNITDATA_REQ header or is an incomplete ire. - */ - if (ire->ire_nce == NULL || ire->ire_nce->nce_res_mp == NULL || - ire->ire_nce->nce_fp_mp != NULL || - ire->ire_nce->nce_state != ND_REACHABLE) - return (B_TRUE); - - ip2dbg(("ire_fastpath_update: trying\n")); - mp = arg; - up = mp->b_rptr; - cmplen = mp->b_wptr - up; - /* Serialize multiple fast path updates */ - mutex_enter(&ire->ire_nce->nce_lock); - up2 = ire->ire_nce->nce_res_mp->b_rptr; - ASSERT(cmplen >= 0); - if (ire->ire_nce->nce_res_mp->b_wptr - up2 != cmplen || - bcmp(up, up2, cmplen) != 0) { - mutex_exit(&ire->ire_nce->nce_lock); - /* - * Don't take the ire off the fastpath list yet, - * since the response may come later. - */ - return (B_FALSE); - } - arpce = ire->ire_nce; - /* Matched - install mp as the nce_fp_mp */ - ip1dbg(("ire_fastpath_update: match\n")); - fp_mp = dupb(mp->b_cont); - if (fp_mp) { - /* - * We checked nce_fp_mp above. Check it again with the - * lock. Update fp_mp only if it has not been done - * already. - */ - if (arpce->nce_fp_mp == NULL) { - /* - * ire_ll_hdr_length is just an optimization to - * store the length. It is used to return the - * fast path header length to the upper layers. - */ - arpce->nce_fp_mp = fp_mp; - ire->ire_ll_hdr_length = - (uint_t)(fp_mp->b_wptr - fp_mp->b_rptr); - } else { - freeb(fp_mp); - } - } - mutex_exit(&ire->ire_nce->nce_lock); - return (B_TRUE); -} - -/* - * This function handles the DL_NOTE_FASTPATH_FLUSH notification from the - * driver. - */ -/* ARGSUSED */ -void -ire_fastpath_flush(ire_t *ire, void *arg) -{ - ill_t *ill; - int res; - - /* No fastpath info? */ - if (ire->ire_nce == NULL || - ire->ire_nce->nce_fp_mp == NULL || ire->ire_nce->nce_res_mp == NULL) - return; - - /* - * Just remove the IRE if it is for non-broadcast dest. Then - * we will create another one which will have the correct - * fastpath info. - */ - switch (ire->ire_type) { - case IRE_CACHE: - ire_delete(ire); - break; - case IRE_MIPRTUN: - case IRE_BROADCAST: - /* - * We can't delete the ire since it is difficult to - * recreate these ire's without going through the - * ipif down/up dance. The nce_fp_mp is protected by the - * nce_lock in the case of IRE_MIPRTUN and IRE_BROADCAST. - * All access to ire->ire_nce->nce_fp_mp in the case of these - * 2 ire types * is protected by nce_lock. - */ - mutex_enter(&ire->ire_nce->nce_lock); - if (ire->ire_nce->nce_fp_mp != NULL) { - freeb(ire->ire_nce->nce_fp_mp); - ire->ire_nce->nce_fp_mp = NULL; - mutex_exit(&ire->ire_nce->nce_lock); - /* - * No fastpath probe if there is no stq i.e. - * i.e. the case of loopback broadcast ire. - */ - if (ire->ire_stq == NULL) - break; - ill = (ill_t *)((ire->ire_stq)->q_ptr); - ire_fastpath_list_add(ill, ire); - res = ill_fastpath_probe(ill, ire->ire_nce->nce_res_mp); - /* - * EAGAIN is an indication of a transient error - * i.e. allocation failure etc. leave the ire in the - * list it will be updated when another probe happens - * for another ire if not it will be taken out of the - * list when the ire is deleted. - */ - if (res != 0 && res != EAGAIN) - ire_fastpath_list_delete(ill, ire); - } else { - mutex_exit(&ire->ire_nce->nce_lock); - } - break; - default: - /* This should not happen! */ - ip0dbg(("ire_fastpath_flush: Wrong ire type %s\n", - ip_nv_lookup(ire_nv_tbl, (int)ire->ire_type))); - break; - } -} - -/* - * Drain the list of ire's waiting for fastpath response. - */ -void -ire_fastpath_list_dispatch(ill_t *ill, boolean_t (*func)(ire_t *, void *), - void *arg) -{ - ire_t *next_ire; - ire_t *current_ire; - ire_t *first_ire; - ire_t *prev_ire = NULL; - - ASSERT(ill != NULL); - - mutex_enter(&ill->ill_lock); - first_ire = current_ire = (ire_t *)ill->ill_fastpath_list; - while (current_ire != (ire_t *)&ill->ill_fastpath_list) { - next_ire = current_ire->ire_fastpath; - /* - * Take it off the list if we're flushing, or if the callback - * routine tells us to do so. Otherwise, leave the ire in the - * fastpath list to handle any pending response from the lower - * layer. We can't drain the list when the callback routine - * comparison failed, because the response is asynchronous in - * nature, and may not arrive in the same order as the list - * insertion. - */ - if (func == NULL || func(current_ire, arg)) { - current_ire->ire_fastpath = NULL; - if (current_ire == first_ire) - ill->ill_fastpath_list = first_ire = next_ire; - else - prev_ire->ire_fastpath = next_ire; - } else { - /* previous element that is still in the list */ - prev_ire = current_ire; - } - current_ire = next_ire; - } - mutex_exit(&ill->ill_lock); -} - -/* - * Add ire to the ire fastpath list. - */ -static void -ire_fastpath_list_add(ill_t *ill, ire_t *ire) -{ - ASSERT(ill != NULL); - ASSERT(ire->ire_stq != NULL); - - rw_enter(&ire->ire_bucket->irb_lock, RW_READER); - mutex_enter(&ill->ill_lock); - - /* - * if ire has not been deleted and - * is not already in the list add it. - */ - if (((ire->ire_marks & IRE_MARK_CONDEMNED) == 0) && - (ire->ire_fastpath == NULL)) { - ire->ire_fastpath = (ire_t *)ill->ill_fastpath_list; - ill->ill_fastpath_list = ire; - } - - mutex_exit(&ill->ill_lock); - rw_exit(&ire->ire_bucket->irb_lock); -} - -/* - * remove ire from the ire fastpath list. - */ -void -ire_fastpath_list_delete(ill_t *ill, ire_t *ire) -{ - ire_t *ire_ptr; - - ASSERT(ire->ire_stq != NULL && ill != NULL); - - mutex_enter(&ill->ill_lock); - if (ire->ire_fastpath == NULL) - goto done; - - ASSERT(ill->ill_fastpath_list != &ill->ill_fastpath_list); - - if (ill->ill_fastpath_list == ire) { - ill->ill_fastpath_list = ire->ire_fastpath; - } else { - ire_ptr = ill->ill_fastpath_list; - while (ire_ptr != (ire_t *)&ill->ill_fastpath_list) { - if (ire_ptr->ire_fastpath == ire) { - ire_ptr->ire_fastpath = ire->ire_fastpath; - break; - } - ire_ptr = ire_ptr->ire_fastpath; - } - } - ire->ire_fastpath = NULL; -done: - mutex_exit(&ill->ill_lock); -} - -/* * Return any local address. We use this to target ourselves * when the src address was specified as 'default'. * Preference for IRE_LOCAL entries. @@ -3844,8 +3565,11 @@ ire_add_v4(ire_t **ire_p, queue_t *q, mblk_t *mp, ipsq_func_t func, * in the list. Otherwise the fast path ack won't find the ire in * the table. */ - if (ire->ire_type == IRE_CACHE || ire->ire_type == IRE_BROADCAST) - ire_fastpath(ire); + if (ire->ire_type == IRE_CACHE || + (ire->ire_type == IRE_BROADCAST && ire->ire_stq != NULL)) { + ASSERT(ire->ire_nce != NULL); + nce_fastpath(ire->ire_nce); + } if (ire->ire_ipif != NULL) ASSERT(!MUTEX_HELD(&ire->ire_ipif->ipif_ill->ill_lock)); *ire_p = ire; @@ -4074,12 +3798,11 @@ ire_delete(ire_t *ire) /* * In case of V4 we might still be waiting for fastpath ack. */ - if (ire->ire_ipversion == IPV4_VERSION && ire->ire_stq != NULL) { - ill_t *ill; - - ill = ire_to_ill(ire); - if (ill != NULL) - ire_fastpath_list_delete(ill, ire); + if (ire->ire_ipversion == IPV4_VERSION && + (ire->ire_type == IRE_CACHE || + (ire->ire_type == IRE_BROADCAST && ire->ire_stq != NULL))) { + ASSERT(ire->ire_nce != NULL); + nce_fastpath_list_delete(ire->ire_nce); } if (ire->ire_ptpn == NULL) { @@ -4213,7 +3936,6 @@ ire_inactive(ire_t *ire) } if (ire->ire_mp != NULL) { - ASSERT(ire->ire_fastpath == NULL); ASSERT(ire->ire_bucket == NULL); mutex_destroy(&ire->ire_lock); BUMP_IRE_STATS(ire_stats_v4, ire_stats_freed); @@ -4346,7 +4068,6 @@ ire_inactive(ire_t *ire) } end: /* This should be true for both V4 and V6 */ - ASSERT(ire->ire_fastpath == NULL); if ((ire->ire_type & IRE_FORWARDTABLE) && (ire->ire_ipversion == IPV4_VERSION) && @@ -5486,7 +5207,7 @@ ire_add_mrtun(ire_t **ire_p, queue_t *q, mblk_t *mp, ipsq_func_t func) } ire_atomic_end(irb_ptr, ire); - ire_fastpath(ire); + nce_fastpath(ire->ire_nce); *ire_p = ire; return (0); } @@ -6947,7 +6668,7 @@ ire_nce_init(ire_t *ire, mblk_t *fp_mp, mblk_t *res_mp) */ mutex_enter(&arpce->nce_lock); arpce->nce_state = ND_REACHABLE; - arpce->nce_flags |= NCE_F_PERMANENT; + arpce->nce_flags |= (NCE_F_PERMANENT | NCE_F_BCAST); arpce->nce_last = TICK_TO_MSEC(lbolt64); ire->ire_nce = arpce; mutex_exit(&arpce->nce_lock); diff --git a/usr/src/uts/common/inet/ip/ip_ndp.c b/usr/src/uts/common/inet/ip/ip_ndp.c index 91ebbd3cc4..e68c4119d5 100644 --- a/usr/src/uts/common/inet/ip/ip_ndp.c +++ b/usr/src/uts/common/inet/ip/ip_ndp.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -81,7 +81,6 @@ static boolean_t nce_cmp_ll_addr(const nce_t *nce, const uchar_t *new_ll_addr, uint32_t ll_addr_len); -static void nce_fastpath(nce_t *nce); static void nce_ire_delete(nce_t *nce); static void nce_ire_delete1(ire_t *ire, char *nce_arg); static void nce_set_ll(nce_t *nce, uchar_t *ll_addr); @@ -3220,7 +3219,7 @@ ndp_sioc_update(ill_t *ill, lif_nd_req_t *lnr) * Note that since ill_fastpath_probe() copies the mblk there is * no need for the hold beyond this function. */ -static void +void nce_fastpath(nce_t *nce) { ill_t *ill = nce->nce_ill; @@ -3260,8 +3259,6 @@ nce_fastpath_list_dispatch(ill_t *ill, boolean_t (*func)(nce_t *, void *), nce_t *first_nce; nce_t *prev_nce = NULL; - ASSERT(ill != NULL && ill->ill_isv6); - mutex_enter(&ill->ill_lock); first_nce = current_nce = (nce_t *)ill->ill_fastpath_list; while (current_nce != (nce_t *)&ill->ill_fastpath_list) { @@ -3299,7 +3296,6 @@ nce_fastpath_list_add(nce_t *nce) ill_t *ill; ill = nce->nce_ill; - ASSERT(ill != NULL && ill->ill_isv6); mutex_enter(&ill->ill_lock); mutex_enter(&nce->nce_lock); @@ -3330,12 +3326,6 @@ nce_fastpath_list_delete(nce_t *nce) ill = nce->nce_ill; ASSERT(ill != NULL); - if (!ill->ill_isv6) { - /* - * v4 nce_t's do not have nce_fastpath set. - */ - return; - } mutex_enter(&ill->ill_lock); if (nce->nce_fastpath == NULL) @@ -3429,8 +3419,30 @@ ndp_fastpath_flush(nce_t *nce, char *arg) if (nce->nce_fp_mp == NULL || nce->nce_res_mp == NULL) return; - /* Just delete the NCE... */ - ndp_delete(nce); + if (nce->nce_ipversion == IPV4_VERSION && + nce->nce_flags & NCE_F_BCAST) { + /* + * IPv4 BROADCAST entries: + * We can't delete the nce since it is difficult to + * recreate these without going through the + * ipif down/up dance. + * + * All access to nce->nce_fp_mp in the case of these + * is protected by nce_lock. + */ + mutex_enter(&nce->nce_lock); + if (nce->nce_fp_mp != NULL) { + freeb(nce->nce_fp_mp); + nce->nce_fp_mp = NULL; + mutex_exit(&nce->nce_lock); + nce_fastpath(nce); + } else { + mutex_exit(&nce->nce_lock); + } + } else { + /* Just delete the NCE... */ + ndp_delete(nce); + } } /* diff --git a/usr/src/uts/common/inet/ip_ire.h b/usr/src/uts/common/inet/ip_ire.h index b32847944e..78a6d6cb82 100644 --- a/usr/src/uts/common/inet/ip_ire.h +++ b/usr/src/uts/common/inet/ip_ire.h @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* Copyright (c) 1990 Mentat Inc. */ @@ -313,8 +313,6 @@ extern void ire_delete_srcif(ire_t *); extern void ire_delete_v6(ire_t *); extern void ire_expire(ire_t *, char *); -extern void ire_fastpath_flush(ire_t *, void *); -extern boolean_t ire_fastpath_update(ire_t *, void *); extern void ire_flush_cache_v4(ire_t *, int); extern void ire_flush_cache_v6(ire_t *, int); @@ -376,16 +374,11 @@ extern boolean_t ire_multirt_need_resolve_v6(const in6_addr_t *, extern ire_t *ipif_lookup_multi_ire(ipif_t *, ipaddr_t); extern ire_t *ipif_lookup_multi_ire_v6(ipif_t *, const in6_addr_t *); -extern void ire_fastpath_list_dispatch(ill_t *, - boolean_t (*)(ire_t *, void *), void *); -extern void ire_fastpath_list_delete(ill_t *, ire_t *); - extern ire_t *ire_get_next_bcast_ire(ire_t *, ire_t *); extern ire_t *ire_get_next_default_ire(ire_t *, ire_t *); extern void ire_arpresolve(ire_t *, ill_t *); extern void ire_freemblk(ire_t *); -extern void ire_fastpath(ire_t *); extern boolean_t ire_match_args(ire_t *, ipaddr_t, ipaddr_t, ipaddr_t, int, const ipif_t *, zoneid_t, uint32_t, const struct ts_label_s *, int); extern int ire_nce_init(ire_t *, mblk_t *, mblk_t *); diff --git a/usr/src/uts/common/inet/ip_ndp.h b/usr/src/uts/common/inet/ip_ndp.h index 4d0dbd5428..ad12297624 100644 --- a/usr/src/uts/common/inet/ip_ndp.h +++ b/usr/src/uts/common/inet/ip_ndp.h @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -128,6 +128,7 @@ extern ndp_g_t ndp4, ndp6; #define NCE_F_ANYCAST 0x20 #define NCE_F_CONDEMNED 0x40 #define NCE_F_UNSOL_ADV 0x80 +#define NCE_F_BCAST 0x100 #define NCE_EXTERNAL_FLAGS_MASK \ (NCE_F_PERMANENT | NCE_F_MAPPING | NCE_F_ISROUTER | NCE_F_NONUD | \ @@ -331,6 +332,7 @@ extern void nce_queue_mp_common(nce_t *, mblk_t *, boolean_t); extern void ndp_flush_qd_mp(nce_t *); extern nce_t *nce_reinit(nce_t *); extern void nce_delete_hw_changed(nce_t *, void *); +extern void nce_fastpath(nce_t *); #ifdef NCE_DEBUG extern void nce_trace_inactive(nce_t *); |