]> git.proxmox.com Git - mirror_frr.git/blobdiff - zebra/zebra_mpls.h
isisd: implement the 'if-state-change' notification
[mirror_frr.git] / zebra / zebra_mpls.h
index c8dab39210ea97cc918a26720d7182f3c3170f6d..86bee129cfe51c68a89cc47a4ac5569e70399bdf 100644 (file)
 
 /* 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 */
 
 typedef struct zebra_ile_t_ zebra_ile_t;
@@ -93,7 +87,7 @@ struct zebra_nhlfe_t_ {
        zebra_lsp_t *lsp;
 
        /* Runtime info - flags, pointers etc. */
-       u_int32_t flags;
+       uint32_t flags;
 #define NHLFE_FLAG_CHANGED     (1 << 0)
 #define NHLFE_FLAG_SELECTED    (1 << 1)
 #define NHLFE_FLAG_MULTIPATH   (1 << 2)
@@ -102,7 +96,7 @@ struct zebra_nhlfe_t_ {
 
        zebra_nhlfe_t *next;
        zebra_nhlfe_t *prev;
-       u_char distance;
+       uint8_t distance;
 };
 
 /*
@@ -133,17 +127,17 @@ struct zebra_lsp_t_ {
        /* List of NHLFE, pointer to best and num equal-cost. */
        zebra_nhlfe_t *nhlfe_list;
        zebra_nhlfe_t *best_nhlfe;
-       u_int32_t num_ecmp;
+       uint32_t num_ecmp;
 
        /* Flags */
-       u_int32_t flags;
+       uint32_t flags;
 #define LSP_FLAG_SCHEDULED        (1 << 0)
 #define LSP_FLAG_INSTALLED        (1 << 1)
 #define LSP_FLAG_CHANGED          (1 << 2)
 
        /* Address-family of NHLFE - saved here for delete. All NHLFEs */
        /* have to be of the same AF */
-       u_char addr_family;
+       uint8_t addr_family;
 };
 
 /*
@@ -157,10 +151,10 @@ struct zebra_fec_t_ {
        mpls_label_t label;
 
        /* Label index (into global label block), if valid */
-       u_int32_t label_index;
+       uint32_t label_index;
 
        /* Flags. */
-       u_int32_t flags;
+       uint32_t flags;
 #define FEC_FLAG_CONFIGURED       (1 << 0)
 
        /* Clients interested in this FEC. */
@@ -169,23 +163,11 @@ struct zebra_fec_t_ {
 
 /* Function declarations. */
 
-/*
- * String to label conversion, labels separated by '/'.
- */
-int mpls_str2label(const char *label_str, u_int8_t *num_labels,
-                  mpls_label_t *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 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);
+int zebra_mpls_label_block_add(struct zebra_vrf *zvrf, uint32_t start_label,
+                              uint32_t end_label);
 
 /*
  * Delete global label block.
@@ -218,7 +200,7 @@ int zebra_mpls_lsp_uninstall(struct zebra_vrf *zvrf, struct route_node *rn,
  * is acceptable.
  */
 int zebra_mpls_fec_register(struct zebra_vrf *zvrf, struct prefix *p,
-                           u_int32_t label_index, struct zserv *client);
+                           uint32_t label_index, struct zserv *client);
 
 /*
  * Deregistration from a client for the label binding for a FEC. The FEC
@@ -228,12 +210,6 @@ int zebra_mpls_fec_register(struct zebra_vrf *zvrf, struct prefix *p,
 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
@@ -286,7 +262,7 @@ void zebra_mpls_print_fec(struct vty *vty, struct zebra_vrf *zvrf,
  */
 int mpls_ftn_update(int add, struct zebra_vrf *zvrf, enum lsp_types_t type,
                    struct prefix *prefix, enum nexthop_types_t gtype,
-                   union g_addr *gate, ifindex_t ifindex, u_int8_t distance,
+                   union g_addr *gate, ifindex_t ifindex, uint8_t distance,
                    mpls_label_t out_label);
 
 /*
@@ -318,6 +294,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
@@ -367,19 +349,26 @@ void zebra_mpls_lsp_schedule(struct zebra_vrf *zvrf);
  * (VTY command handler).
  */
 void zebra_mpls_print_lsp(struct vty *vty, struct zebra_vrf *zvrf,
-                         mpls_label_t label, u_char use_json);
+                         mpls_label_t label, bool use_json);
 
 /*
  * Display MPLS label forwarding table (VTY command handler).
  */
 void zebra_mpls_print_lsp_table(struct vty *vty, struct zebra_vrf *zvrf,
-                               u_char use_json);
+                               bool use_json);
 
 /*
  * Display MPLS LSP configuration of all static LSPs (VTY command handler).
  */
 int zebra_mpls_write_lsp_config(struct vty *vty, struct zebra_vrf *zvrf);
 
+/*
+ * Called when VRF becomes inactive, cleans up information but keeps
+ * the table itself.
+ * NOTE: Currently supported only for default VRF.
+ */
+void zebra_mpls_cleanup_tables(struct zebra_vrf *zvrf);
+
 /*
  * Called upon process exiting, need to delete LSP forwarding
  * entries from the kernel.
@@ -408,11 +397,27 @@ void zebra_mpls_vty_init(void);
 /*
  * Distance (priority) definition for LSP NHLFE.
  */
-static inline u_char lsp_distance(enum lsp_types_t type)
+static inline uint8_t lsp_distance(enum lsp_types_t type)
 {
-       if (type == ZEBRA_LSP_STATIC)
+       switch (type) {
+       case ZEBRA_LSP_STATIC:
                return (route_distance(ZEBRA_ROUTE_STATIC));
+       case ZEBRA_LSP_LDP:
+               return (route_distance(ZEBRA_ROUTE_LDP));
+       case ZEBRA_LSP_BGP:
+               return (route_distance(ZEBRA_ROUTE_BGP));
+       case ZEBRA_LSP_NONE:
+       case ZEBRA_LSP_SHARP:
+       case ZEBRA_LSP_SR:
+               return 150;
+       }
 
+       /*
+        * For some reason certain compilers do not believe
+        * that all the cases have been handled.  And
+        * WTF does this work differently than when I removed
+        * the default case????
+        */
        return 150;
 }
 
@@ -427,11 +432,42 @@ static inline enum lsp_types_t lsp_type_from_re_type(int re_type)
                return ZEBRA_LSP_STATIC;
        case ZEBRA_ROUTE_BGP:
                return ZEBRA_LSP_BGP;
+       case ZEBRA_ROUTE_SHARP:
+               return ZEBRA_LSP_SHARP;
        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:
+               return ZEBRA_ROUTE_KERNEL;
+       case ZEBRA_LSP_SHARP:
+               return ZEBRA_ROUTE_SHARP;
+       }
+
+       /*
+        * For some reason certain compilers do not believe
+        * that all the cases have been handled.  And
+        * WTF does this work differently than when I removed
+        * the default case????
+        */
+       return ZEBRA_ROUTE_KERNEL;
+}
+
 /* NHLFE type as printable string. */
 static inline const char *nhlfe_type2str(enum lsp_types_t lsp_type)
 {
@@ -442,9 +478,21 @@ static inline const char *nhlfe_type2str(enum lsp_types_t lsp_type)
                return "LDP";
        case ZEBRA_LSP_BGP:
                return "BGP";
-       default:
+       case ZEBRA_LSP_SR:
+               return "SR";
+       case ZEBRA_LSP_SHARP:
+               return "SHARP";
+       case ZEBRA_LSP_NONE:
                return "Unknown";
        }
+
+       /*
+        * For some reason certain compilers do not believe
+        * that all the cases have been handled.  And
+        * WTF does this work differently than when I removed
+        * the default case????
+        */
+       return "Unknown";
 }
 
 static inline void mpls_mark_lsps_for_processing(struct zebra_vrf *zvrf)