]> git.puffer.fish Git - mirror/frr.git/commitdiff
lib, sharpd, zebra: Update the zapi_vrf_label call to add afi
authorDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 14 Feb 2018 06:11:09 +0000 (01:11 -0500)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 14 Feb 2018 06:11:09 +0000 (01:11 -0500)
Add the ability to pass in an afi to zebra.  zebra_vrf keeps
track of the afi/label tuple and then does the right thing
before we call down.  AF_MPLS does not care about v4 or v6
it just knows label and what device to use for lookup.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
lib/zclient.c
lib/zclient.h
sharpd/sharp_vty.c
sharpd/sharp_zebra.c
sharpd/sharp_zebra.h
zebra/zebra_vrf.h
zebra/zserv.c

index 8e8b50b15eaad375920d70b8c82c7f59814c74e0..714888a3f3f260625fe4621c5de3828e38cd2e64 100644 (file)
@@ -363,7 +363,7 @@ static int zebra_hello_send(struct zclient *zclient)
        return 0;
 }
 
-void zclient_send_vrf_label(struct zclient *zclient, vrf_id_t vrf_id,
+void zclient_send_vrf_label(struct zclient *zclient, vrf_id_t vrf_id, afi_t afi,
                            mpls_label_t label, enum lsp_types_t ltype)
 {
        struct stream *s;
@@ -373,6 +373,7 @@ void zclient_send_vrf_label(struct zclient *zclient, vrf_id_t vrf_id,
 
        zclient_create_header(s, ZEBRA_VRF_LABEL, vrf_id);
        stream_putl(s, label);
+       stream_putc(s, afi);
        stream_putc(s, ltype);
        stream_putw_at(s, 0, stream_get_endp(s));
        zclient_send_message(zclient);
index 344b45fb5457de941103289f28d4d8bc9b6f55cd..d8a70c6cf339a263774152eee3f5dfc59b946c0d 100644 (file)
@@ -390,9 +390,15 @@ extern void redist_del_instance(struct redist_proto *, u_short);
  * label for lookup.  If you pass in MPLS_LABEL_NONE
  * we will cause a delete action and remove this label pop
  * operation.
+ *
+ * The underlying AF_MPLS doesn't care about afi's
+ * but we can make the zebra_vrf keep track of what
+ * we have installed and play some special games
+ * to get them both installed.
  */
 extern void zclient_send_vrf_label(struct zclient *zclient, vrf_id_t vrf_id,
-                                  mpls_label_t label, enum lsp_types_t ltype);
+                                  afi_t afi, mpls_label_t label,
+                                  enum lsp_types_t ltype);
 
 extern void zclient_send_reg_requests(struct zclient *, vrf_id_t);
 extern void zclient_send_dereg_requests(struct zclient *, vrf_id_t);
index 4f7d61b22fad069679689e0d92d7d9150c729ad3..0e7d1f2c29758f4529f4cd051a690480a25b41f4 100644 (file)
@@ -80,14 +80,17 @@ DEFPY (install_routes,
 }
 
 DEFPY(vrf_label, vrf_label_cmd,
-      "sharp label vrf NAME$name label (0-100000)$label",
+      "sharp label <ip$ipv4|ipv6$ipv6> vrf NAME$name label (0-100000)$label",
       "Sharp Routing Protocol\n"
       "Give a vrf a label\n"
+      "Pop and forward for IPv4\n"
+      "Pop and forward for IPv6\n"
       VRF_CMD_HELP_STR
       "The label to use, 0 specifies remove the label installed from previous\n"
       "Specified range to use\n")
 {
        struct vrf *vrf;
+       afi_t afi = (ipv4) ? AFI_IP : AFI_IP6;
 
        if (strcmp(name, "default") == 0)
                vrf = vrf_lookup_by_id(VRF_DEFAULT);
@@ -102,7 +105,7 @@ DEFPY(vrf_label, vrf_label_cmd,
        if (label == 0)
                label = MPLS_LABEL_NONE;
 
-       vrf_label_add(vrf->vrf_id, label);
+       vrf_label_add(vrf->vrf_id, afi, label);
        return CMD_SUCCESS;
 }
 
index f771e53f0c5da148ff2f79f0cb222e2431b5033c..78e8cf0adca4dd1363fc3f3c0d1e25662f51eb7a 100644 (file)
@@ -152,9 +152,9 @@ static void zebra_connected(struct zclient *zclient)
        zclient_send_reg_requests(zclient, VRF_DEFAULT);
 }
 
-void vrf_label_add(vrf_id_t vrf_id, mpls_label_t label)
+void vrf_label_add(vrf_id_t vrf_id, afi_t afi, mpls_label_t label)
 {
-       zclient_send_vrf_label(zclient, vrf_id, label, ZEBRA_LSP_SHARP);
+       zclient_send_vrf_label(zclient, vrf_id, afi, label, ZEBRA_LSP_SHARP);
 }
 
 void route_add(struct prefix *p, struct nexthop *nh)
index 281c67ff9467bbe5a438e3413d3846e4c588715e..0bba443bd48c43c6ee6c6f12069bd576f10f4b5e 100644 (file)
@@ -24,7 +24,7 @@
 
 extern void sharp_zebra_init(void);
 
-extern void vrf_label_add(vrf_id_t vrf_id, mpls_label_t label);
+extern void vrf_label_add(vrf_id_t vrf_id, afi_t afi, mpls_label_t label);
 extern void route_add(struct prefix *p, struct nexthop *nh);
 extern void route_delete(struct prefix *p);
 #endif
index bfeb4b386ce9d316549124b2d52c77e2f5c781df..d3a5316b9d4571b53b74c1349cedf43d0d829266 100644 (file)
@@ -80,7 +80,7 @@ struct zebra_vrf {
        struct zebra_ns *zns;
 
        /* MPLS Label to handle L3VPN <-> vrf popping */
-       mpls_label_t label;
+       mpls_label_t label[AFI_MAX];
 
        /* MPLS static LSP config table */
        struct hash *slsp_table;
index 704b861960269afbc20078c710ad994a9122b608..ab8d8b51bcbc5b9905bd09f53028ab75640dd088 100644 (file)
@@ -2486,23 +2486,27 @@ stream_failure:
        return 1;
 }
 
+
 static void zread_vrf_label(struct zserv *client,
                            struct zebra_vrf *zvrf)
 {
        struct interface *ifp;
        mpls_label_t nlabel;
+       afi_t afi;
        struct stream *s;
        struct zebra_vrf *def_zvrf;
        enum lsp_types_t ltype;
 
        s = client->ibuf;
        STREAM_GETL(s, nlabel);
-       if (nlabel == zvrf->label) {
+       STREAM_GETC(s, afi);
+       if (nlabel == zvrf->label[afi]) {
                /*
                 * Nothing to do here move along
                 */
                return;
        }
+
        STREAM_GETC(s, ltype);
 
        if (zvrf->vrf->vrf_id != VRF_DEFAULT)
@@ -2518,15 +2522,15 @@ static void zread_vrf_label(struct zserv *client,
 
        def_zvrf = zebra_vrf_lookup_by_id(VRF_DEFAULT);
 
-       if (zvrf->label != MPLS_LABEL_NONE)
-               mpls_lsp_uninstall(def_zvrf, ltype, zvrf->label,
+       if (zvrf->label[afi] != MPLS_LABEL_NONE)
+               mpls_lsp_uninstall(def_zvrf, ltype, zvrf->label[afi],
                                   NEXTHOP_TYPE_IFINDEX, NULL, ifp->ifindex);
 
        if (nlabel != MPLS_LABEL_NONE)
                mpls_lsp_install(def_zvrf, ltype, nlabel, MPLS_LABEL_IMPLICIT_NULL,
                                 NEXTHOP_TYPE_IFINDEX, NULL, ifp->ifindex);
 
-       zvrf->label = nlabel;
+       zvrf->label[afi] = nlabel;
 stream_failure:
        return;
 }