> if (ire->ire_ipversion == IPV4_VERSION) > nce = ndp_lookup_v4(ire_to_ill(ire), > &ire->ire_addr, B_FALSE); > else > nce = ndp_lookup_v6(ire_to_ill(ire), > &ire->ire_addr_v6, B_FALSE); > ASSERT(nce != NULL); > nce->nce_state = ND_REACHABLE; > nce_fastpath(nce); > NCE_REFRELE(nce);
Sowmini and I found the problem: &ire->ire_addr should be &ire->ire_gateway_addr, since that's what ire_nce_init() uses. Also, the V6 code isn't needed since ip_newourte() is V4-only. Things appear to be working well now. BTW, my earlier suggestion of reusing the gateway IRE's ire_fp_mp has a fatal flaw: the hardware address in that ire_fp_mp will not match the hardware address of the output interface. As a result, any replies to the packets we send that use that hardware address will be dropped by the hardware. Of course, snoop will show these packets (since it puts the hardware into promiscuous mode), which made the problem exceptionally hard to debug :-O -- meem
