+ if (do_update) {
+ int route_ev_code = 0;
+
+ if (llchange)
+ route_ev_code = ROUTE_LLENTRY_CHANGED;
+ else
+ route_ev_code = ROUTE_LLENTRY_RESOLVED;
+
+ /* Enqueue work item to invoke callback for this route entry */
+ route_event_enqueue_nwk_wq_entry(rt, NULL, route_ev_code, NULL, TRUE);
+
+ if (ln->ln_router || (rt->rt_flags & RTF_ROUTER)) {
+ struct radix_node_head *rnh = NULL;
+ struct route_event rt_ev;
+ route_event_init(&rt_ev, rt, NULL, llchange ? ROUTE_LLENTRY_CHANGED :
+ ROUTE_LLENTRY_RESOLVED);
+ /*
+ * We already have a valid reference on rt.
+ * The function frees that before returning.
+ * We therefore don't need an extra reference here
+ */
+ RT_UNLOCK(rt);
+ lck_mtx_lock(rnh_lock);
+
+ rnh = rt_tables[AF_INET6];
+ if (rnh != NULL)
+ (void) rnh->rnh_walktree(rnh, route_event_walktree,
+ (void *)&rt_ev);
+ lck_mtx_unlock(rnh_lock);
+ RT_LOCK(rt);
+ }
+ }
+