]> git.proxmox.com Git - mirror_frr.git/blobdiff - zebra/zebra_mpls.h
OSPFD: Update Segment Routing following reviews
[mirror_frr.git] / zebra / zebra_mpls.h
index 6e45fb8649ba8aac91ccd8fde991b1d35734f4ce..9d8ca34f82cbaa4e54d3b9a198994a14eef71bc8 100644 (file)
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License
- * along with GNU Zebra; see the file COPYING.  If not, write to the Free
- * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
- * 02111-1307, USA.
+ * You should have received a copy of the GNU General Public License along
+ * with this program; see the file COPYING; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #ifndef _ZEBRA_MPLS_H
 
 /* Definitions and macros. */
 
-#define MPLS_MAX_LABELS 2  /* Maximum # labels that can be pushed. */
-
 #define NHLFE_FAMILY(nhlfe)                                                    \
        (((nhlfe)->nexthop->type == NEXTHOP_TYPE_IPV6                          \
          || (nhlfe)->nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX)              \
                 ? AF_INET6                                                    \
                 : AF_INET)
 
+#define MPLS_LABEL_HELPSTR                                                     \
+       "Specify label(s) for this route\nOne or more "                        \
+       "labels in the range (16-1048575) separated by '/'\n"
 
 /* Typedefs */
 
@@ -54,6 +54,7 @@ typedef struct zebra_snhlfe_t_ zebra_snhlfe_t;
 typedef struct zebra_slsp_t_ zebra_slsp_t;
 typedef struct zebra_nhlfe_t_ zebra_nhlfe_t;
 typedef struct zebra_lsp_t_ zebra_lsp_t;
+typedef struct zebra_fec_t_ zebra_fec_t;
 
 /*
  * (Outgoing) nexthop label forwarding entry configuration
@@ -143,6 +144,26 @@ struct zebra_lsp_t_ {
        u_char addr_family;
 };
 
+/*
+ * FEC to label binding.
+ */
+struct zebra_fec_t_ {
+       /* FEC (prefix) */
+       struct route_node *rn;
+
+       /* In-label - either statically bound or derived from label block. */
+       mpls_label_t label;
+
+       /* Label index (into global label block), if valid */
+       u_int32_t label_index;
+
+       /* Flags. */
+       u_int32_t flags;
+#define FEC_FLAG_CONFIGURED       (1 << 0)
+
+       /* Clients interested in this FEC. */
+       struct list *client_list;
+};
 
 /* Function declarations. */
 
@@ -156,7 +177,107 @@ int mpls_str2label(const char *label_str, u_int8_t *num_labels,
  * Label to string conversion, labels in string separated by '/'.
  */
 char *mpls_label2str(u_int8_t num_labels, mpls_label_t *labels, char *buf,
-                    int len);
+                    int len, int pretty);
+
+/*
+ * Add/update global label block.
+ */
+int zebra_mpls_label_block_add(struct zebra_vrf *zvrf, u_int32_t start_label,
+                              u_int32_t end_label);
+
+/*
+ * Delete global label block.
+ */
+int zebra_mpls_label_block_del(struct zebra_vrf *vrf);
+
+/*
+ * Display MPLS global label block configuration (VTY command handler).
+ */
+int zebra_mpls_write_label_block_config(struct vty *vty, struct zebra_vrf *vrf);
+
+/*
+ * Install dynamic LSP entry.
+ */
+int zebra_mpls_lsp_install(struct zebra_vrf *zvrf, struct route_node *rn,
+                          struct route_entry *re);
+
+/*
+ * Uninstall dynamic LSP entry, if any.
+ */
+int zebra_mpls_lsp_uninstall(struct zebra_vrf *zvrf, struct route_node *rn,
+                            struct route_entry *re);
+
+/*
+ * Registration from a client for the label binding for a FEC. If a binding
+ * already exists, it is informed to the client.
+ * NOTE: If there is a manually configured label binding, that is used.
+ * Otherwise, if aa label index is specified, it means we have to allocate the
+ * label from a locally configured label block (SRGB), if one exists and index
+ * is acceptable.
+ */
+int zebra_mpls_fec_register(struct zebra_vrf *zvrf, struct prefix *p,
+                           u_int32_t label_index, struct zserv *client);
+
+/*
+ * Deregistration from a client for the label binding for a FEC. The FEC
+ * itself is deleted if no other registered clients exist and there is no
+ * label bound to the FEC.
+ */
+int zebra_mpls_fec_unregister(struct zebra_vrf *zvrf, struct prefix *p,
+                             struct zserv *client);
+
+/*
+ * Cleanup any FECs registered by this client.
+ */
+int zebra_mpls_cleanup_fecs_for_client(struct zebra_vrf *zvrf,
+                                      struct zserv *client);
+
+/*
+ * Return FEC (if any) to which this label is bound.
+ * Note: Only works for per-prefix binding and when the label is not
+ * implicit-null.
+ * TODO: Currently walks entire table, can optimize later with another
+ * hash..
+ */
+zebra_fec_t *zebra_mpls_fec_for_label(struct zebra_vrf *zvrf,
+                                     mpls_label_t label);
+
+/*
+ * Inform if specified label is currently bound to a FEC or not.
+ */
+int zebra_mpls_label_already_bound(struct zebra_vrf *zvrf, mpls_label_t label);
+
+/*
+ * Add static FEC to label binding. If there are clients registered for this
+ * FEC, notify them. If there are labeled routes for this FEC, install the
+ * label forwarding entry.
+ */
+int zebra_mpls_static_fec_add(struct zebra_vrf *zvrf, struct prefix *p,
+                             mpls_label_t in_label);
+
+/*
+ * Remove static FEC to label binding. If there are no clients registered
+ * for this FEC, delete the FEC; else notify clients.
+ * Note: Upon delete of static binding, if label index exists for this FEC,
+ * client may need to be updated with derived label.
+ */
+int zebra_mpls_static_fec_del(struct zebra_vrf *zvrf, struct prefix *p);
+
+/*
+ * Display MPLS FEC to label binding configuration (VTY command handler).
+ */
+int zebra_mpls_write_fec_config(struct vty *vty, struct zebra_vrf *zvrf);
+
+/*
+ * Display MPLS FEC to label binding (VTY command handler).
+ */
+void zebra_mpls_print_fec_table(struct vty *vty, struct zebra_vrf *zvrf);
+
+/*
+ * Display MPLS FEC to label binding for a specific FEC (VTY command handler).
+ */
+void zebra_mpls_print_fec(struct vty *vty, struct zebra_vrf *zvrf,
+                         struct prefix *p);
 
 /*
  * Install/uninstall a FEC-To-NHLFE (FTN) binding.
@@ -174,7 +295,7 @@ int mpls_ftn_update(int add, struct zebra_vrf *zvrf, enum lsp_types_t type,
 int mpls_lsp_install(struct zebra_vrf *zvrf, enum lsp_types_t type,
                     mpls_label_t in_label, mpls_label_t out_label,
                     enum nexthop_types_t gtype, union g_addr *gate,
-                    char *ifname, ifindex_t ifindex);
+                    ifindex_t ifindex);
 
 /*
  * Uninstall a particular NHLFE in the forwarding table. If this is
@@ -182,7 +303,7 @@ int mpls_lsp_install(struct zebra_vrf *zvrf, enum lsp_types_t type,
  */
 int mpls_lsp_uninstall(struct zebra_vrf *zvrf, enum lsp_types_t type,
                       mpls_label_t in_label, enum nexthop_types_t gtype,
-                      union g_addr *gate, char *ifname, ifindex_t ifindex);
+                      union g_addr *gate, ifindex_t ifindex);
 
 /*
  * Uninstall all LDP NHLFEs for a particular LSP forwarding entry.
@@ -195,6 +316,12 @@ void mpls_ldp_lsp_uninstall_all(struct hash_backet *backet, void *ctxt);
  */
 void mpls_ldp_ftn_uninstall_all(struct zebra_vrf *zvrf, int afi);
 
+/*
+ * Uninstall all Segment Routing NHLFEs for a particular LSP forwarding entry.
+ * If no other NHLFEs exist, the entry would be deleted.
+ */
+void mpls_sr_lsp_uninstall_all(struct hash_backet *backet, void *ctxt);
+
 #if defined(HAVE_CUMULUS)
 /*
  * Check that the label values used in LSP creation are consistent. The
@@ -206,8 +333,7 @@ int zebra_mpls_lsp_label_consistent(struct zebra_vrf *zvrf,
                                    mpls_label_t in_label,
                                    mpls_label_t out_label,
                                    enum nexthop_types_t gtype,
-                                   union g_addr *gate, char *ifname,
-                                   ifindex_t ifindex);
+                                   union g_addr *gate, ifindex_t ifindex);
 #endif /* HAVE_CUMULUS */
 
 /*
@@ -220,7 +346,7 @@ int zebra_mpls_lsp_label_consistent(struct zebra_vrf *zvrf,
 int zebra_mpls_static_lsp_add(struct zebra_vrf *zvrf, mpls_label_t in_label,
                              mpls_label_t out_label,
                              enum nexthop_types_t gtype, union g_addr *gate,
-                             char *ifname, ifindex_t ifindex);
+                             ifindex_t ifindex);
 
 /*
  * Delete static LSP entry. This may be the delete of one particular
@@ -231,7 +357,7 @@ int zebra_mpls_static_lsp_add(struct zebra_vrf *zvrf, mpls_label_t in_label,
  */
 int zebra_mpls_static_lsp_del(struct zebra_vrf *zvrf, mpls_label_t in_label,
                              enum nexthop_types_t gtype, union g_addr *gate,
-                             char *ifname, ifindex_t ifindex);
+                             ifindex_t ifindex);
 
 /*
  * Schedule all MPLS label forwarding entries for processing.
@@ -288,26 +414,54 @@ void zebra_mpls_vty_init(void);
  */
 static inline u_char lsp_distance(enum lsp_types_t type)
 {
-       if (type == ZEBRA_LSP_STATIC)
+       switch (type) {
+       case ZEBRA_LSP_STATIC:
                return (route_distance(ZEBRA_ROUTE_STATIC));
-
-       return 150;
+       case ZEBRA_LSP_LDP:
+               return (route_distance(ZEBRA_ROUTE_LDP));
+       case ZEBRA_LSP_BGP:
+               return (route_distance(ZEBRA_ROUTE_BGP));
+       default:
+               return 150;
+       }
 }
 
 /*
  * Map RIB type to LSP type. Used when labeled-routes from BGP
  * are converted into LSPs.
  */
-static inline enum lsp_types_t lsp_type_from_rib_type(int rib_type)
+static inline enum lsp_types_t lsp_type_from_re_type(int re_type)
 {
-       switch (rib_type) {
+       switch (re_type) {
        case ZEBRA_ROUTE_STATIC:
                return ZEBRA_LSP_STATIC;
+       case ZEBRA_ROUTE_BGP:
+               return ZEBRA_LSP_BGP;
        default:
                return ZEBRA_LSP_NONE;
        }
 }
 
+/*
+ * Map LSP type to RIB type.
+ */
+static inline int re_type_from_lsp_type(enum lsp_types_t lsp_type)
+{
+       switch (lsp_type) {
+       case ZEBRA_LSP_STATIC:
+               return ZEBRA_ROUTE_STATIC;
+       case ZEBRA_LSP_LDP:
+               return ZEBRA_ROUTE_LDP;
+       case ZEBRA_LSP_BGP:
+               return ZEBRA_ROUTE_BGP;
+       case ZEBRA_LSP_SR:
+               return ZEBRA_ROUTE_OSPF;
+       case ZEBRA_LSP_NONE:
+       default:
+               return ZEBRA_ROUTE_KERNEL;
+       }
+}
+
 /* NHLFE type as printable string. */
 static inline const char *nhlfe_type2str(enum lsp_types_t lsp_type)
 {
@@ -316,6 +470,10 @@ static inline const char *nhlfe_type2str(enum lsp_types_t lsp_type)
                return "Static";
        case ZEBRA_LSP_LDP:
                return "LDP";
+       case ZEBRA_LSP_BGP:
+               return "BGP";
+       case ZEBRA_LSP_SR:
+               return "SR";
        default:
                return "Unknown";
        }