diff options
Diffstat (limited to 'src/vnet/ip6-nd/ip6_nd_inline.h')
-rw-r--r-- | src/vnet/ip6-nd/ip6_nd_inline.h | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/vnet/ip6-nd/ip6_nd_inline.h b/src/vnet/ip6-nd/ip6_nd_inline.h index ad0c3a3a79b..c959c94ed1d 100644 --- a/src/vnet/ip6-nd/ip6_nd_inline.h +++ b/src/vnet/ip6-nd/ip6_nd_inline.h @@ -22,6 +22,8 @@ #include <vnet/ethernet/ethernet.h> #include <vnet/ip/icmp46_packet.h> #include <vnet/ip/ip6.h> +#include <vnet/ip-neighbor/ip_neighbor_types.h> +#include <vnet/ip6-nd/ip6_ra.h> typedef enum { @@ -70,6 +72,13 @@ icmp6_send_neighbor_advertisement ( clib_host_to_net_u32 (ICMP6_NEIGHBOR_ADVERTISEMENT_FLAG_SOLICITED | ICMP6_NEIGHBOR_ADVERTISEMENT_FLAG_OVERRIDE); + /* if sending RAs is enabled, the "router" flag should be set, + * otherwise, neighbors may believe we have changed from a router + * to a host - RFC 4861 section 4.4 */ + if (ip6_ra_adv_enabled (sw_if_index0)) + icmp6_nsa->advertisement_flags |= + clib_host_to_net_u32 (ICMP6_NEIGHBOR_ADVERTISEMENT_FLAG_ROUTER); + icmp6_nsa->icmp.checksum = 0; icmp6_nsa->icmp.checksum = ip6_tcp_udp_icmp_compute_checksum (vm, b, ip6_h, &bogus_length); @@ -88,6 +97,10 @@ icmp6_send_neighbor_advertisement ( vnet_buffer (b)->sw_if_index[VLIB_TX] = sw_if_index0; vnet_buffer (b)->sw_if_index[VLIB_RX] = vnet_main.local_interface_sw_if_index; + + vlib_increment_simple_counter ( + &ip_neighbor_counters[AF_IP6].ipnc[VLIB_TX][IP_NEIGHBOR_CTR_REPLY], + vm->thread_index, sw_if_index0, 1); } #endif /* included_ip6_nd_inline_h */ |