summaryrefslogtreecommitdiffstats
path: root/bgpd/bgp_label.h
diff options
context:
space:
mode:
Diffstat (limited to 'bgpd/bgp_label.h')
-rw-r--r--bgpd/bgp_label.h108
1 files changed, 108 insertions, 0 deletions
diff --git a/bgpd/bgp_label.h b/bgpd/bgp_label.h
new file mode 100644
index 0000000..4061e87
--- /dev/null
+++ b/bgpd/bgp_label.h
@@ -0,0 +1,108 @@
+/* BGP carrying Label information
+ * Copyright (C) 2013 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 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 _BGP_LABEL_H
+#define _BGP_LABEL_H
+
+#define BGP_LABEL_BYTES 3
+#define BGP_LABEL_BITS 24
+#define BGP_WITHDRAW_LABEL 0x800000
+#define BGP_PREVENT_VRF_2_VRF_LEAK 0xFFFFFFFE
+
+struct bgp_dest;
+struct bgp_path_info;
+struct peer;
+
+extern int bgp_reg_for_label_callback(mpls_label_t new_label, void *labelid,
+ bool allocated);
+extern void bgp_reg_dereg_for_label(struct bgp_dest *dest,
+ struct bgp_path_info *pi, bool reg);
+extern int bgp_parse_fec_update(void);
+extern mpls_label_t bgp_adv_label(struct bgp_dest *dest,
+ struct bgp_path_info *pi, struct peer *to,
+ afi_t afi, safi_t safi);
+
+extern int bgp_nlri_parse_label(struct peer *peer, struct attr *attr,
+ struct bgp_nlri *packet);
+
+static inline int bgp_labeled_safi(safi_t safi)
+{
+ /* NOTE: This API really says a label (tag) MAY be present. Not all EVPN
+ * routes will have a label.
+ */
+ if ((safi == SAFI_LABELED_UNICAST) || (safi == SAFI_MPLS_VPN)
+ || (safi == SAFI_EVPN))
+ return 1;
+ return 0;
+}
+
+static inline int bgp_is_withdraw_label(mpls_label_t *label)
+{
+ uint8_t *pkt = (uint8_t *)label;
+
+ /* The check on pkt[2] for 0x00 or 0x02 is in case bgp_set_valid_label()
+ * was called on the withdraw label */
+ if (((pkt[0] == 0x80) || (pkt[0] == 0x00)) && (pkt[1] == 0x00)
+ && ((pkt[2] == 0x00) || (pkt[2] == 0x02)))
+ return 1;
+ return 0;
+}
+
+static inline int bgp_is_valid_label(const mpls_label_t *label)
+{
+ uint8_t *t = (uint8_t *)label;
+ if (!t)
+ return 0;
+ return (t[2] & 0x02);
+}
+
+static inline void bgp_set_valid_label(mpls_label_t *label)
+{
+ uint8_t *t = (uint8_t *)label;
+ if (t)
+ t[2] |= 0x02;
+}
+
+static inline void bgp_unset_valid_label(mpls_label_t *label)
+{
+ uint8_t *t = (uint8_t *)label;
+ if (t)
+ t[2] &= ~0x02;
+}
+
+static inline void bgp_register_for_label(struct bgp_dest *dest,
+ struct bgp_path_info *pi)
+{
+ bgp_reg_dereg_for_label(dest, pi, true);
+}
+
+static inline void bgp_unregister_for_label(struct bgp_dest *dest)
+{
+ bgp_reg_dereg_for_label(dest, NULL, false);
+}
+
+/* Return BOS value of label stream */
+static inline uint8_t label_bos(mpls_label_t *label)
+{
+ uint8_t *t = (uint8_t *)label;
+ return (t[2] & 0x01);
+};
+
+#endif /* _BGP_LABEL_H */