Allow multiple MPLS output labels to be passed on the CLI

Change-Id: Ib5af105e32b6b0df86923e189ab6bf6ee59de5b9
Signed-off-by: Neale Ranns <nranns@cisco.com>
diff --git a/src/vnet/mpls/mpls.c b/src/vnet/mpls/mpls.c
index 266ba42..5021ac2 100644
--- a/src/vnet/mpls/mpls.c
+++ b/src/vnet/mpls/mpls.c
@@ -66,8 +66,18 @@
       *label = MPLS_IETF_ROUTER_ALERT_LABEL;
   else if (unformat (input, MPLS_IETF_IMPLICIT_NULL_STRING))
       *label = MPLS_IETF_IMPLICIT_NULL_LABEL;
+  else if (unformat (input, MPLS_IETF_IPV4_EXPLICIT_NULL_BRIEF_STRING))
+      *label = MPLS_IETF_IPV4_EXPLICIT_NULL_LABEL;
+  else if (unformat (input, MPLS_IETF_IPV6_EXPLICIT_NULL_BRIEF_STRING))
+      *label = MPLS_IETF_IPV6_EXPLICIT_NULL_LABEL;
+  else if (unformat (input, MPLS_IETF_ROUTER_ALERT_BRIEF_STRING))
+      *label = MPLS_IETF_ROUTER_ALERT_LABEL;
+  else if (unformat (input, MPLS_IETF_IMPLICIT_NULL_BRIEF_STRING))
+      *label = MPLS_IETF_IMPLICIT_NULL_LABEL;
   else if (unformat (input, "%d", label))
       ;
+  else
+    return (0);
 
   return (1);
 }
@@ -388,16 +398,23 @@
           rpath.frp_flags = FIB_ROUTE_PATH_INTF_RX;
 	  vec_add1(rpaths, rpath);
       }
-      else if (unformat (line_input, "out-label %U",
-                         unformat_mpls_unicast_label,
-			 &out_label))
+      else if (unformat (line_input, "out-labels"))
       {
-	  if (vec_len(rpaths) == 0)
-	  {
-	      error = clib_error_return(0 , "Paths then labels");
+	  if (vec_len (rpaths) == 0)
+          {
+	      error = clib_error_return (0, "Paths then labels");
 	      goto done;
-	  }
-	  vec_add1(rpaths[vec_len(rpaths)-1].frp_label_stack, out_label);
+          }
+          else
+          {
+              while (unformat (line_input, "%U",
+                               unformat_mpls_unicast_label,
+                               &out_label))
+              {
+                  vec_add1 (rpaths[vec_len (rpaths) - 1].frp_label_stack,
+                            out_label);
+              }
+          }
       }
       else
       {
diff --git a/src/vnet/mpls/mpls_tunnel.c b/src/vnet/mpls/mpls_tunnel.c
index 6452a60..5211c92 100644
--- a/src/vnet/mpls/mpls_tunnel.c
+++ b/src/vnet/mpls/mpls_tunnel.c
@@ -800,11 +800,24 @@
             is_del = 0;
         else if (unformat (line_input, "add"))
             is_del = 0;
-        else if (unformat (line_input, "out-label %U",
-                           unformat_mpls_unicast_label, &out_label))
-        {
-            vec_add1(rpath.frp_label_stack, out_label);
-        }
+        else if (unformat (line_input, "out-labels"))
+	{
+            if (vec_len (rpaths) == 0)
+	    {
+                error = clib_error_return (0, "Paths then labels");
+                goto done;
+            }
+            else
+            {
+                while (unformat (line_input, "%U",
+                                 unformat_mpls_unicast_label,
+                                 &out_label))
+                {
+                    vec_add1 (rpaths[vec_len (rpaths) - 1].frp_label_stack,
+                              out_label);
+                }
+            }
+	}
         else if (unformat (line_input, "via %U %U",
                            unformat_ip4_address,
                            &rpath.frp_addr.ip4,