summaryrefslogtreecommitdiffstats
path: root/src/vnet/ethernet
diff options
context:
space:
mode:
authorSteven <sluong@cisco.com>2018-06-05 11:09:32 -0700
committerSteven <sluong@cisco.com>2018-06-05 11:09:32 -0700
commit9f781d84b0943b03af2a9fd0b7c4cef721d1d4c6 (patch)
treea78172c460d265c89d3717a5cb8cb45775fe523b /src/vnet/ethernet
parent439a122f3acd745dcb70e9b32bb518e43967afe4 (diff)
bond: send gratuitous arp when the active slave went down in active-backup mode
- Modify the API send_ip6_na and send_ip4_garp to take sw_if_index instead of vnet_hw_interface_t and add call to build_ethernet_rewrite to support subinterface/vlan - Add code to bonding driver to send an event to bond_process when the first interface becomes active or when the active interface is down - Create a bond_process to walk the interface and the corresponding subinterfaces to send garp/ip6_na when an event is received. - Minor cleanup in bonding/node.c Note: dpdk bonding driver does not send garp/ip6_na for subinterfaces. There is no attempt to fix it here. But the infra is now done and should be easy to add the support. Change-Id: If3ecc4cd0fb3051330f7fa11ca0dab3e18557ce1 Signed-off-by: Steven <sluong@cisco.com>
Diffstat (limited to 'src/vnet/ethernet')
-rw-r--r--src/vnet/ethernet/arp.c25
-rw-r--r--src/vnet/ethernet/arp_packet.h5
2 files changed, 16 insertions, 14 deletions
diff --git a/src/vnet/ethernet/arp.c b/src/vnet/ethernet/arp.c
index 249e3b6e8cf..682bc2a2c92 100644
--- a/src/vnet/ethernet/arp.c
+++ b/src/vnet/ethernet/arp.c
@@ -2526,22 +2526,22 @@ ethernet_arp_change_mac (u32 sw_if_index)
}
void
-send_ip4_garp (vlib_main_t * vm, const vnet_hw_interface_t * hi)
+send_ip4_garp (vlib_main_t * vm, u32 sw_if_index)
{
ip4_main_t *i4m = &ip4_main;
- ip4_address_t *ip4_addr =
- ip4_interface_first_address (i4m, hi->sw_if_index, 0);
+ ip4_address_t *ip4_addr = ip4_interface_first_address (i4m, sw_if_index, 0);
- send_ip4_garp_w_addr (vm, ip4_addr, hi);
+ send_ip4_garp_w_addr (vm, ip4_addr, sw_if_index);
}
void
send_ip4_garp_w_addr (vlib_main_t * vm,
- const ip4_address_t * ip4_addr,
- const vnet_hw_interface_t * hi)
+ const ip4_address_t * ip4_addr, u32 sw_if_index)
{
ip4_main_t *i4m = &ip4_main;
- u32 sw_if_index = hi->sw_if_index;
+ vnet_main_t *vnm = vnet_get_main ();
+ u8 *rewrite, rewrite_len;
+ vnet_hw_interface_t *hi = vnet_get_sup_hw_interface (vnm, sw_if_index);
if (ip4_addr)
{
@@ -2563,11 +2563,14 @@ send_ip4_garp_w_addr (vlib_main_t * vm,
/* Setup MAC header with ARP Etype and broadcast DMAC */
vlib_buffer_t *b = vlib_get_buffer (vm, bi);
- vlib_buffer_advance (b, -sizeof (ethernet_header_t));
+ rewrite =
+ ethernet_build_rewrite (vnm, sw_if_index, VNET_LINK_ARP,
+ VNET_REWRITE_FOR_SW_INTERFACE_ADDRESS_BROADCAST);
+ rewrite_len = vec_len (rewrite);
+ vlib_buffer_advance (b, -rewrite_len);
ethernet_header_t *e = vlib_buffer_get_current (b);
- e->type = clib_host_to_net_u16 (ETHERNET_TYPE_ARP);
- clib_memcpy (e->src_address, hi->hw_address, sizeof (e->src_address));
- memset (e->dst_address, 0xff, sizeof (e->dst_address));
+ clib_memcpy (e->dst_address, rewrite, rewrite_len);
+ vec_free (rewrite);
/* Send GARP packet out the specified interface */
vnet_buffer (b)->sw_if_index[VLIB_RX] =
diff --git a/src/vnet/ethernet/arp_packet.h b/src/vnet/ethernet/arp_packet.h
index d2a23a5949f..e5f424d7879 100644
--- a/src/vnet/ethernet/arp_packet.h
+++ b/src/vnet/ethernet/arp_packet.h
@@ -168,10 +168,9 @@ ethernet_arp_ip4_entry_t *ip4_neighbors_pool (void);
ethernet_arp_ip4_entry_t *ip4_neighbor_entries (u32 sw_if_index);
u8 *format_ethernet_arp_ip4_entry (u8 * s, va_list * va);
-void send_ip4_garp (vlib_main_t * vm, const vnet_hw_interface_t * hi);
+void send_ip4_garp (vlib_main_t * vm, u32 sw_if_index);
void send_ip4_garp_w_addr (vlib_main_t * vm,
- const ip4_address_t * ip4_addr,
- const vnet_hw_interface_t * hi);
+ const ip4_address_t * ip4_addr, u32 sw_if_index);
#endif /* included_ethernet_arp_packet_h */