summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/nexthop.h9
-rw-r--r--zebra/Makefile.am2
-rw-r--r--zebra/zebra_mpls.h155
-rw-r--r--zebra/zebra_vrf.h6
4 files changed, 171 insertions, 1 deletions
diff --git a/lib/nexthop.h b/lib/nexthop.h
index 39e8b5425f..801904306e 100644
--- a/lib/nexthop.h
+++ b/lib/nexthop.h
@@ -25,6 +25,7 @@
#define _LIB_NEXTHOP_H
#include "prefix.h"
+#include "mpls.h"
/* Maximum next hop string length - gateway + ifindex */
#define NEXTHOP_STRLEN (INET6_ADDRSTRLEN + 30)
@@ -44,6 +45,14 @@ enum nexthop_types_t
NEXTHOP_TYPE_BLACKHOLE, /* Null0 nexthop. */
};
+/* Nexthop label structure. */
+struct nexthop_label
+{
+ u_int8_t num_labels;
+ u_int8_t reserved[3];
+ mpls_label_t label[0]; /* 1 or more labels. */
+};
+
/* Nexthop structure. */
struct nexthop
{
diff --git a/zebra/Makefile.am b/zebra/Makefile.am
index 32c94d3f0e..4b6f9188bf 100644
--- a/zebra/Makefile.am
+++ b/zebra/Makefile.am
@@ -46,7 +46,7 @@ noinst_HEADERS = \
interface.h ipforward.h irdp.h router-id.h kernel_socket.h \
rt_netlink.h zebra_fpm.h zebra_fpm_private.h zebra_rnh.h \
zebra_ptm_redistribute.h zebra_ptm.h zebra_routemap.h \
- zebra_ns.h zebra_vrf.h ioctl_solaris.h zebra_static.h
+ zebra_ns.h zebra_vrf.h ioctl_solaris.h zebra_static.h zebra_mpls.h
zebra_LDADD = $(otherobj) ../lib/libzebra.la $(LIBCAP)
diff --git a/zebra/zebra_mpls.h b/zebra/zebra_mpls.h
new file mode 100644
index 0000000000..b24a58e16a
--- /dev/null
+++ b/zebra/zebra_mpls.h
@@ -0,0 +1,155 @@
+/*
+ * Zebra MPLS Data structures and definitions
+ * Copyright (C) 2015 Cumulus Networks, Inc.
+ *
+ * This file is part of GNU Zebra.
+ *
+ * GNU Zebra is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * GNU Zebra is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * 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.
+ */
+
+#ifndef _ZEBRA_MPLS_H
+#define _ZEBRA_MPLS_H
+
+#include "prefix.h"
+#include "table.h"
+#include "queue.h"
+#include "hash.h"
+#include "jhash.h"
+#include "nexthop.h"
+#include "vty.h"
+#include "memory.h"
+#include "mpls.h"
+#include "zebra/zserv.h"
+
+
+/* Definitions and macros. */
+
+#define NHLFE_FAMILY(nhlfe) \
+ (((nhlfe)->nexthop->type == NEXTHOP_TYPE_IPV6 || \
+ (nhlfe)->nexthop->type == NEXTHOP_TYPE_IPV6_IFINDEX) ? AF_INET6 : AF_INET)
+
+
+/* Typedefs */
+
+typedef struct zebra_ile_t_ zebra_ile_t;
+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;
+
+/* LSP types. */
+enum lsp_types_t
+{
+ ZEBRA_LSP_INVALID = 0, /* Invalid. */
+ ZEBRA_LSP_STATIC = 1, /* Static LSP. */
+};
+
+/*
+ * (Outgoing) nexthop label forwarding entry configuration
+ */
+struct zebra_snhlfe_t_
+{
+ /* Nexthop information */
+ enum nexthop_types_t gtype;
+ union g_addr gate;
+ char *ifname;
+ ifindex_t ifindex;
+
+ /* Out label. */
+ mpls_label_t out_label;
+
+ /* Backpointer to base entry. */
+ zebra_slsp_t *slsp;
+
+ /* Pointers to more outgoing information for same in-label */
+ zebra_snhlfe_t *next;
+ zebra_snhlfe_t *prev;
+};
+
+/*
+ * (Outgoing) nexthop label forwarding entry
+ */
+struct zebra_nhlfe_t_
+{
+ /* Type of entry - static etc. */
+ enum lsp_types_t type;
+
+ /* Nexthop information (with outgoing label) */
+ struct nexthop *nexthop;
+
+ /* Backpointer to base entry. */
+ zebra_lsp_t *lsp;
+
+ /* Runtime info - flags, pointers etc. */
+ u_int32_t flags;
+#define NHLFE_FLAG_CHANGED (1 << 0)
+#define NHLFE_FLAG_SELECTED (1 << 1)
+#define NHLFE_FLAG_MULTIPATH (1 << 2)
+#define NHLFE_FLAG_DELETED (1 << 3)
+#define NHLFE_FLAG_INSTALLED (1 << 4)
+
+ zebra_nhlfe_t *next;
+ zebra_nhlfe_t *prev;
+ u_char distance;
+};
+
+/*
+ * Incoming label entry
+ */
+struct zebra_ile_t_
+{
+ mpls_label_t in_label;
+};
+
+/*
+ * Label swap entry static configuration.
+ */
+struct zebra_slsp_t_
+{
+ /* Incoming label */
+ zebra_ile_t ile;
+
+ /* List of outgoing nexthop static configuration */
+ zebra_snhlfe_t *snhlfe_list;
+
+};
+
+/*
+ * Label swap entry (ile -> list of nhlfes)
+ */
+struct zebra_lsp_t_
+{
+ /* Incoming label */
+ zebra_ile_t ile;
+
+ /* 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;
+
+ /* Flags */
+ u_int32_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;
+};
+
+
+#endif /*_ZEBRA_MPLS_H */
diff --git a/zebra/zebra_vrf.h b/zebra/zebra_vrf.h
index 456c6fdad8..1062c90988 100644
--- a/zebra/zebra_vrf.h
+++ b/zebra/zebra_vrf.h
@@ -74,6 +74,12 @@ struct zebra_vrf
* Back pointer to the owning namespace.
*/
struct zebra_ns *zns;
+
+ /* MPLS static LSP config table */
+ struct hash *slsp_table;
+
+ /* MPLS label forwarding table */
+ struct hash *lsp_table;
};
extern struct list *zvrf_list;