>                      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

Reply via email to