X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=vnet%2Fvnet%2Fip%2Fip6_neighbor.c;h=57359f7adf3faceda4d48de439203024968b18d5;hb=3f993a6f07bcfd1aff360276c3696bb3909b2fa9;hp=11df776e1fce0dc065d2198144a0d09e00483f58;hpb=0bfe5d8c792abcdbcf27bfcc7b7b353fba04aee2;p=vpp.git diff --git a/vnet/vnet/ip/ip6_neighbor.c b/vnet/vnet/ip/ip6_neighbor.c index 11df776e1fc..57359f7adf3 100644 --- a/vnet/vnet/ip/ip6_neighbor.c +++ b/vnet/vnet/ip/ip6_neighbor.c @@ -812,7 +812,8 @@ icmp6_neighbor_solicitation_or_advertisement (vlib_main_t * vm, 128); if (FIB_NODE_INDEX_INVALID == fei || - !(FIB_ENTRY_FLAG_LOCAL & fib_entry_get_flags(fei))) + !(FIB_ENTRY_FLAG_LOCAL & + fib_entry_get_flags_for_source(fei, FIB_SOURCE_INTERFACE))) { error0 = ICMP6_ERROR_NEIGHBOR_SOLICITATION_SOURCE_UNKNOWN; } @@ -3405,8 +3406,9 @@ int vnet_ip6_nd_term (vlib_main_t * vm, /* Check if anyone want ND events for L2 BDs */ p = mhash_get (&nm->mac_changes_by_address, &ip6a_zero); - if (p && shg == 0) - { /* Only SHG 0 interface which is more likely local */ + if (p && shg == 0 && /* Only SHG 0 interface which is more likely local */ + !ip6_address_is_link_local_unicast (&ip->src_address)) + { u32 next_index = p[0]; while (next_index != (u32)~0) { @@ -3472,3 +3474,23 @@ int vnet_ip6_nd_term (vlib_main_t * vm, return 0; } + +void +ethernet_ndp_change_mac (vlib_main_t * vm, u32 sw_if_index) +{ + ip6_neighbor_main_t * nm = &ip6_neighbor_main; + ip6_neighbor_t * n; + + /* *INDENT-OFF* */ + pool_foreach (n, nm->neighbor_pool, ({ + if (n->key.sw_if_index == sw_if_index) + { + if (ADJ_INDEX_INVALID != n->adj_index) + { + adj_nbr_update_rewrite(n->adj_index, + n->link_layer_address); + } + } + })); + /* *INDENT-ON* */ +}