On Thu, May 10, 2018 at 7:28 PM, John Lo (loj) <[email protected]> wrote:
> Hi Jon,
>
Hi John,
> This is not the right behavior.
>
I had that suspicion... :-)
I think it is caused by reuse of a static ARP entry in the IP4 neighbor
> pool with static bit still set. The code merely set the dynamic bit in the
> flags but left the static bit untouched (similarly for the static path) in
> arp.c function vnet_arp_set_ip4_over_ethernet_internal ():
>
>
>
> e->time_last_updated = vlib_time_now (vm);
>
> if (is_static)
>
> e->flags |= ETHERNET_ARP_IP4_ENTRY_FLAG_STATIC;
>
> else
>
> e->flags |= ETHERNET_ARP_IP4_ENTRY_FLAG_DYNAMIC;
>
Ah, right. So it should always be one or the other, and never both. Right?
I spotted another error in the function vnet_arp_flush_ip4_over_
> ethernet_internal()
>
>
>
> if (e->flags & ETHERNET_ARP_IP4_ENTRY_FLAG_STATIC)
>
> {
>
> e->flags &= ETHERNET_ARP_IP4_ENTRY_FLAG_DYNAMIC;
>
> }
>
> else if (e->flags & ETHERNET_ARP_IP4_ENTRY_FLAG_DYNAMIC)
>
> {
>
> arp_entry_free (eai, e);
>
> }
>
>
>
> I believe the “if static” path should be:
>
> e->flags &= ~ETHERNET_ARP_IP4_ENTRY_FLAG_DYNAMIC;
>
>
>
> Would you like to submit a patch to fix them?
>
Sure! I will make a first-effort and submit a patch!
jdl