ip-neighbor: fix ip6_ra_cmd 13/26213/2
authorDave Barach <dave@barachs.net>
Wed, 26 Feb 2020 13:02:58 +0000 (08:02 -0500)
committerAndrew Yourtchenko <ayourtch@gmail.com>
Mon, 30 Mar 2020 13:56:32 +0000 (13:56 +0000)
The option parsing loop had "break" statements included in each
'if (unformat (line_input, "this-option ...") option_values=xxx;'
statement.

Result: the code would silently ignore all but the first
option. Probably broken forever, not easy to spot because the code
looks OK even though it's badly broken.

Type: fix

Signed-off-by: Dave Barach <dave@barachs.net>
Change-Id: I667bee85b4ca654b53fb3af421f957957ed0f0f8
(cherry picked from commit 7249b90ab21c20138907e692dcb6032aea9e2f0f)

src/vnet/ip6-nd/ip6_ra.c

index ebc2c4b..b64292f 100644 (file)
@@ -1882,34 +1882,28 @@ ip6_ra_cmd (vlib_main_t * vm,
                         unformat_ip6_address, &ip6_addr, &addr_len))
        {
          add_radv_info = 0;
-         break;
        }
       else if (unformat (line_input, "ra-managed-config-flag"))
        {
          managed = 1;
-         break;
        }
       else if (unformat (line_input, "ra-other-config-flag"))
        {
          other = 1;
-         break;
        }
       else if (unformat (line_input, "ra-suppress") ||
               unformat (line_input, "ra-surpress"))
        {
          suppress = 1;
-         break;
        }
       else if (unformat (line_input, "ra-suppress-link-layer") ||
               unformat (line_input, "ra-surpress-link-layer"))
        {
          suppress_ll_option = 1;
-         break;
        }
       else if (unformat (line_input, "ra-send-unicast"))
        {
          send_unicast = 1;
-         break;
        }
       else if (unformat (line_input, "ra-lifetime"))
        {
@@ -1919,7 +1913,6 @@ ip6_ra_cmd (vlib_main_t * vm,
              goto done;
            }
          use_lifetime = 1;
-         break;
        }
       else if (unformat (line_input, "ra-initial"))
        {
@@ -1929,7 +1922,6 @@ ip6_ra_cmd (vlib_main_t * vm,
              error = unformat_parse_error (line_input);
              goto done;
            }
-         break;
        }
       else if (unformat (line_input, "ra-interval"))
        {
@@ -1941,12 +1933,10 @@ ip6_ra_cmd (vlib_main_t * vm,
 
          if (!unformat (line_input, "%d", &ra_min_interval))
            ra_min_interval = 0;
-         break;
        }
       else if (unformat (line_input, "ra-cease"))
        {
          cease = 1;
-         break;
        }
       else
        {