ip6-nd: set router flag on NA if appropriate
[vpp.git] / src / vnet / ip6-nd / ip6_ra.c
index d359770..65b7cf0 100644 (file)
@@ -204,6 +204,16 @@ ip6_ra_get_itf (u32 sw_if_index)
   return (NULL);
 }
 
+u8
+ip6_ra_adv_enabled (u32 sw_if_index)
+{
+  ip6_ra_t *ra;
+
+  ra = ip6_ra_get_itf (sw_if_index);
+
+  return ((ra != NULL) && (ra->send_radv != 0));
+}
+
 /* for "syslogging" - use elog for now */
 #define foreach_log_level           \
   _ (DEBUG, "DEBUG")                 \
@@ -413,12 +423,9 @@ icmp6_router_solicitation (vlib_main_t * vm,
 
                  radv_info = ip6_ra_get_itf (sw_if_index0);
 
-                 error0 = ((!radv_info) ?
-                           ICMP6_ERROR_ROUTER_SOLICITATION_RADV_NOT_CONFIG :
-                           error0);
-                 error0 = radv_info->send_radv == 0 ?
-                            ICMP6_ERROR_ROUTER_SOLICITATION_RADV_NOT_CONFIG :
-                            error0;
+                 error0 = ((!radv_info || 0 == radv_info->send_radv) ?
+                             ICMP6_ERROR_ROUTER_SOLICITATION_RADV_NOT_CONFIG :
+                             error0);
                  if (error0 == ICMP6_ERROR_NONE)
                    {
                      f64 now = vlib_time_now (vm);
@@ -640,6 +647,8 @@ icmp6_router_solicitation (vlib_main_t * vm,
                          /* Reuse current MAC header, copy SMAC to DMAC and
                           * interface MAC to SMAC */
                          vlib_buffer_reset (p0);
+                         vlib_buffer_advance (
+                           p0, vnet_buffer (p0)->l2_hdr_offset);
                          eth0 = vlib_buffer_get_current (p0);
                          clib_memcpy (eth0->dst_address, eth0->src_address,
                                       6);
@@ -1394,9 +1403,6 @@ ip6_ra_link_enable (u32 sw_if_index)
   radv_info->initial_adverts_sent = radv_info->initial_adverts_count - 1;
   radv_info->initial_adverts_interval = MAX_INITIAL_RTR_ADVERT_INTERVAL;
 
-  /* deafult is to send */
-  radv_info->send_radv = 1;
-
   /* fill in delegate for this interface that will be needed later */
   radv_info->adv_link_mtu =
     vnet_sw_interface_get_mtu (vnet_get_main (), sw_if_index, VNET_MTU_IP6);
@@ -1704,6 +1710,9 @@ ip6_ra_config (vlib_main_t * vm, u32 sw_if_index,
   if (!radv_info)
     return (VNET_API_ERROR_IP6_NOT_ENABLED);
 
+  /* Start off believing that we're going to send radv's */
+  radv_info->send_radv = 1;
+
   if ((max_interval != 0) && (min_interval == 0))
     min_interval = .75 * max_interval;
 
@@ -2029,8 +2038,7 @@ ip6_ra_cmd (vlib_main_t * vm,
        }
       else
        {
-         error = unformat_parse_error (line_input);
-         goto done;
+         break;
        }
     }