#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;
+VLIB_REGISTER_LOG_CLASS (ip4_neighbor_log, static) = {
+ .class_name = "ip4",
+ .subclass_name = "neighbor",
+};
+
+#define log_debug(fmt, ...) \
+ vlib_log_debug (ip4_neighbor_log.class, fmt, __VA_ARGS__)
+
void
-ip4_neighbor_probe_dst (u32 sw_if_index, const ip4_address_t * dst)
+ip4_neighbor_probe_dst (u32 sw_if_index, u32 thread_index,
+ const ip4_address_t *dst)
{
ip4_address_t src;
adj_index_t ai;
/* 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);
}
void
-ip4_neighbor_advertise (vlib_main_t * vm,
- vnet_main_t * vnm,
- u32 sw_if_index, const ip4_address_t * addr)
+ip4_neighbor_advertise (vlib_main_t *vm, vnet_main_t *vnm, u32 sw_if_index,
+ u32 thread_index, const ip4_address_t *addr)
{
vnet_hw_interface_t *hi = vnet_get_sup_hw_interface (vnm, sw_if_index);
ip4_main_t *i4m = &ip4_main;
if (NULL == addr)
{
- fib_sas4_get (sw_if_index, NULL, &tmp);
- addr = &tmp;
+ if (fib_sas4_get (sw_if_index, NULL, &tmp) ||
+ ip4_sas_by_sw_if_index (sw_if_index, NULL, &tmp))
+ addr = &tmp;
}
if (addr)
{
- clib_warning ("Sending GARP for IP4 address %U on sw_if_idex %d",
- format_ip4_address, addr, sw_if_index);
+ log_debug ("Sending GARP for IP4 address %U on sw_if_idex %d",
+ format_ip4_address, addr, sw_if_index);
/* Form GARP packet for output - Gratuitous ARP is an ARP request packet
where the interface IP/MAC pair is used for both source and request
to_next[0] = bi;
f->n_vectors = 1;
vlib_put_frame_to_node (vm, hi->output_node_index, f);
+
+ vlib_increment_simple_counter (
+ &ip_neighbor_counters[AF_IP4].ipnc[VLIB_TX][IP_NEIGHBOR_CTR_GRAT],
+ thread_index, sw_if_index, 1);
}
}
/* 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];