]> git.puffer.fish Git - matthieu/frr.git/commitdiff
zebra: add explicit-null option for static MPLS LSPs
authorRenato Westphal <renato@opensourcerouting.org>
Sat, 17 Sep 2016 13:55:24 +0000 (10:55 -0300)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Fri, 23 Sep 2016 13:31:22 +0000 (09:31 -0400)
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
zebra/zebra_mpls.c
zebra/zebra_mpls_vty.c

index 07b69eccd6a124745cb68e35d874e6d532a6b84e..ccb81dcff55e597ad203ae88f8cacf943dc37fbd 100644 (file)
@@ -1837,18 +1837,31 @@ zebra_mpls_write_lsp_config (struct vty *vty, struct zebra_vrf *zvrf)
   zebra_slsp_t *slsp;
   zebra_snhlfe_t *snhlfe;
   struct listnode *node;
-  char buf[INET6_ADDRSTRLEN];
   struct list *slsp_list = hash_get_sorted_list(zvrf->slsp_table, slsp_cmp);
 
   for (ALL_LIST_ELEMENTS_RO(slsp_list, node, slsp))
       {
         for (snhlfe = slsp->snhlfe_list; snhlfe; snhlfe = snhlfe->next)
           {
+           char buf[INET6_ADDRSTRLEN];
             char lstr[30];
+
             snhlfe2str (snhlfe, buf, BUFSIZ);
+           switch (snhlfe->out_label) {
+             case MPLS_V4_EXP_NULL_LABEL:
+             case MPLS_V6_EXP_NULL_LABEL:
+               strlcpy(lstr, "explicit-null", sizeof(lstr));
+               break;
+             case MPLS_IMP_NULL_LABEL:
+               strlcpy(lstr, "implicit-null", sizeof(lstr));
+               break;
+             default:
+               sprintf(lstr, "%u", snhlfe->out_label);
+               break;
+           }
+
             vty_out (vty, "mpls lsp %u %s %s%s",
-                     slsp->ile.in_label, buf,
-                     label2str(snhlfe->out_label, lstr, 30), VTY_NEWLINE);
+                     slsp->ile.in_label, buf, lstr, VTY_NEWLINE);
           }
       }
 
index 6975ba560999b8a23d1e77f82a200656d872f291..e5f6932e872f6f0453f3c71bed7ebaca6a09b011 100644 (file)
@@ -115,6 +115,10 @@ zebra_mpls_transit_lsp (struct vty *vty, int add_cmd, const char *inlabel_str,
     {
       if (outlabel_str[0] == 'i')
         out_label = MPLS_IMP_NULL_LABEL;
+      else if (outlabel_str[0] == 'e' && gtype == NEXTHOP_TYPE_IPV4)
+        out_label = MPLS_V4_EXP_NULL_LABEL;
+      else if (outlabel_str[0] == 'e' && gtype == NEXTHOP_TYPE_IPV6)
+        out_label = MPLS_V6_EXP_NULL_LABEL;
       else
         out_label = atoi(outlabel_str);
     }
@@ -150,13 +154,14 @@ zebra_mpls_transit_lsp (struct vty *vty, int add_cmd, const char *inlabel_str,
 
 DEFUN (mpls_transit_lsp,
        mpls_transit_lsp_cmd,
-       "mpls lsp <16-1048575> (A.B.C.D|X:X::X:X) (<16-1048575>|implicit-null)",
+       "mpls lsp <16-1048575> (A.B.C.D|X:X::X:X) (<16-1048575>|explicit-null|implicit-null)",
        MPLS_STR
        "Establish label switched path\n"
        "Incoming MPLS label\n"
        "IPv4 gateway address\n"
        "IPv6 gateway address\n"
        "Outgoing MPLS label\n"
+       "Use Explicit-Null label\n"
        "Use Implicit-Null label\n")
 {
   return zebra_mpls_transit_lsp (vty, 1, argv[0], argv[1], argv[2], NULL);
@@ -177,7 +182,7 @@ DEFUN (no_mpls_transit_lsp,
 
 ALIAS (no_mpls_transit_lsp,
        no_mpls_transit_lsp_out_label_cmd,
-       "no mpls lsp <16-1048575> (A.B.C.D|X:X::X:X) (<16-1048575>|implicit-null)",
+       "no mpls lsp <16-1048575> (A.B.C.D|X:X::X:X) (<16-1048575>|explicit-null|implicit-null)",
        NO_STR
        MPLS_STR
        "Establish label switched path\n"
@@ -185,6 +190,7 @@ ALIAS (no_mpls_transit_lsp,
        "IPv4 gateway address\n"
        "IPv6 gateway address\n"
        "Outgoing MPLS label\n"
+       "Use Explicit-Null label\n"
        "Use Implicit-Null label\n")
  
 DEFUN (no_mpls_transit_lsp_all,