#include <vnet/ethernet/ethernet.h>
#include <vnet/util/throttle.h>
#include <vnet/fib/fib_sas.h>
+#include <vnet/ip/ip_sas.h>
/** ARP throttling */
static throttle_t arp_throttle;
/* any glean will do, it's just for the rewrite */
ai = adj_glean_get (FIB_PROTOCOL_IP4, sw_if_index, NULL);
- if (ADJ_INDEX_INVALID != ai && fib_sas4_get (sw_if_index, dst, &src))
+ if (ADJ_INDEX_INVALID != ai &&
+ (fib_sas4_get (sw_if_index, dst, &src) ||
+ ip4_sas_by_sw_if_index (sw_if_index, dst, &src)))
ip4_neighbor_probe (vlib_get_main (),
vnet_get_main (), adj_get (ai), &src, dst);
}
if (NULL == addr)
{
- if (fib_sas4_get (sw_if_index, NULL, &tmp))
+ if (fib_sas4_get (sw_if_index, NULL, &tmp) ||
+ ip4_sas_by_sw_if_index (sw_if_index, NULL, &tmp))
addr = &tmp;
}
/* resolve the incomplete adj */
resolve0 = adj0->sub_type.nbr.next_hop.ip4;
/* Src IP address in ARP header. */
- if (!fib_sas4_get (sw_if_index0, &resolve0, &src0))
+ if (!fib_sas4_get (sw_if_index0, &resolve0, &src0) &&
+ !ip4_sas_by_sw_if_index (sw_if_index0, &resolve0, &src0))
{
/* No source address available */
p0->error = node->errors[IP4_ARP_ERROR_NO_SOURCE_ADDRESS];
#include <vnet/ip-neighbor/ip6_neighbor.h>
#include <vnet/util/throttle.h>
#include <vnet/fib/fib_sas.h>
+#include <vnet/ip/ip_sas.h>
/** ND throttling */
static throttle_t nd_throttle;
{
ip6_address_t src;
- if (fib_sas6_get (sw_if_index, dst, &src))
+ if (fib_sas6_get (sw_if_index, dst, &src) ||
+ ip6_sas_by_sw_if_index (sw_if_index, dst, &src))
ip6_neighbor_probe (vlib_get_main (), vnet_get_main (),
sw_if_index, &src, dst);
}
* Choose source address based on destination lookup
* adjacency.
*/
- if (!fib_sas6_get (sw_if_index0, &ip0->dst_address, &src))
+ if (!fib_sas6_get (sw_if_index0, &ip0->dst_address, &src) &&
+ !ip6_sas_by_sw_if_index (sw_if_index0, &ip0->dst_address, &src))
{
/* There is no address on the interface */
p0->error = node->errors[IP6_NBR_ERROR_NO_SOURCE_ADDRESS];