X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvnet%2Fethernet%2Farp.c;h=f7d8ff867f80d221062ffadb928d29b4bc2cba91;hb=1855b8e4;hp=c6f9324eabee41f50e4c19765e0bdb16c3e40b26;hpb=0131b6c438e1e7ccc41c9abd1f02ac398d34dfaa;p=vpp.git diff --git a/src/vnet/ethernet/arp.c b/src/vnet/ethernet/arp.c index c6f9324eabe..f7d8ff867f8 100644 --- a/src/vnet/ethernet/arp.c +++ b/src/vnet/ethernet/arp.c @@ -492,6 +492,15 @@ arp_update_adjacency (vnet_main_t * vnm, u32 sw_if_index, u32 ai) arp_nbr_probe (adj); } break; + case IP_LOOKUP_NEXT_BCAST: + adj_nbr_update_rewrite (ai, + ADJ_NBR_REWRITE_FLAG_COMPLETE, + ethernet_build_rewrite + (vnm, + sw_if_index, + VNET_LINK_IP4, + VNET_REWRITE_FOR_SW_INTERFACE_ADDRESS_BROADCAST)); + break; case IP_LOOKUP_NEXT_MCAST: { /* @@ -633,7 +642,13 @@ vnet_arp_set_ip4_over_ethernet_internal (vnet_main_t * vnm, /* Refuse to over-write static arp. */ if (!is_static && (e->flags & ETHERNET_ARP_IP4_ENTRY_FLAG_STATIC)) - return -2; + { + /* if MAC address match, still check to send event */ + if (0 == memcmp (e->ethernet_address, + a->ethernet, sizeof (e->ethernet_address))) + goto check_customers; + return -2; + } make_new_arp_cache_entry = 0; } } @@ -685,11 +700,12 @@ vnet_arp_set_ip4_over_ethernet_internal (vnet_main_t * vnm, goto check_customers; } - /* Update time stamp and ethernet address. */ + /* Update ethernet address. */ clib_memcpy (e->ethernet_address, a->ethernet, sizeof (e->ethernet_address)); } + /* Update time stamp and flags. */ e->time_last_updated = vlib_time_now (vm); if (is_static) { @@ -2342,13 +2358,16 @@ arp_term_l2bd (vlib_main_t * vm, ethertype0 = clib_net_to_host_u16 (*(u16 *) (l3h0 - 2)); arp0 = (ethernet_arp_header_t *) l3h0; - if (PREDICT_FALSE ((ethertype0 != ETHERNET_TYPE_ARP) || - (arp0->opcode != - clib_host_to_net_u16 - (ETHERNET_ARP_OPCODE_request)))) + if (ethertype0 != ETHERNET_TYPE_ARP) + goto check_ip6_nd; + + if ((arp0->opcode != + clib_host_to_net_u16 (ETHERNET_ARP_OPCODE_request)) && + (arp0->opcode != + clib_host_to_net_u16 (ETHERNET_ARP_OPCODE_reply))) goto check_ip6_nd; - /* Must be ARP request packet here */ + /* Must be ARP request/reply packet here */ if (PREDICT_FALSE ((node->flags & VLIB_NODE_FLAG_TRACE) && (p0->flags & VLIB_BUFFER_IS_TRACED))) { @@ -2357,7 +2376,7 @@ arp_term_l2bd (vlib_main_t * vm, clib_memcpy (t0, l3h0, sizeof (ethernet_arp_input_trace_t)); } - error0 = ETHERNET_ARP_ERROR_replies_sent; + error0 = 0; error0 = (arp0->l2_type != clib_net_to_host_u16 (ETHERNET_ARP_HARDWARE_TYPE_ethernet) @@ -2379,8 +2398,13 @@ arp_term_l2bd (vlib_main_t * vm, sizeof (eth0->src_address)) || ethernet_address_cast (arp0->ip4_over_ethernet[0].ethernet))) { - error0 = ETHERNET_ARP_ERROR_l2_address_mismatch; - goto drop; + /* VRRP virtual MAC may be different to SMAC in ARP reply */ + if (memcmp (arp0->ip4_over_ethernet[0].ethernet, vrrp_prefix, + sizeof (vrrp_prefix))) + { + error0 = ETHERNET_ARP_ERROR_l2_address_mismatch; + goto drop; + } } if (PREDICT_FALSE (ip4_address_is_multicast (&arp0->ip4_over_ethernet[0].ip4)))